rt,
逆波兰表达式是一种把运算符前置的算式表达式,普通的表达式2+3的逆波兰表达式位+2 3。逆波兰表达式的优点是不必用括号来改变运算次序,例如(2+3)∗4表示为∗+2 3 4,本题求解逆波兰表达式的值,其中运算符包括+ - * /四个
输入格式 输入一行,其中运算符和运算数之间用空格隔开
输出格式 输出为一行表达式的值
逆波兰表达式的定义:
1.一个数就是一个逆波兰表达式,这个数就是逆波兰表达式本身 //相当于一个终止条件
2.“运算符 逆波兰表达式 逆波兰表达式” 是逆波兰表达式,值为两个逆波兰表达式运算出的结果
代码:
#include<bits/stdc++.h>
using namespace std;
int cnt=0;
string s;
double nbl(){
while(cnt<s.size() && s[cnt]==' ' )cnt++;
if(s[cnt]=='+' || s[cnt]=='-' || s[cnt]=='*' || s[cnt]=='/'){
cnt++;
if(s[cnt-1]=='+')return nbl()+nbl();
if(s[cnt-1]=='-')return nbl()-nbl();
if(s[cnt-1]=='/')return nbl()/nbl();
if(s[cnt-1]=='*')return nbl()*nbl();
}
else if(s[cnt]<='9' && s[cnt]>='0'){
int i=cnt;
for(;i<s.size() && (s[i]=='.' || isdigit(s[i]));i++);
string SS=s.substr(cnt,i-cnt+1);
cnt=i;
char S[100]={};
for(int i=0;i<SS.size();i++)S[i]=SS[i];
double a=atof(S);
return a;
}
}
int main(){
getline(cin,s);
printf("%.6lf",nbl());
}
80分
附:样例:
输入:
* + 11.0 12.0 + 24.0 35.0
输出
1357.000000