题记:开两个栈,一个栈记录数字,一个栈记录计算符号。
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
char str[210];
int check(char x){
//预处理符号
if(x>='0'&&x<='9')
return 1;
else if(x=='+'||x=='-')
return 2;
else if(x=='*'||x=='/')
return 3;
else return 0;
}
int main(){
stack<double>s1;
stack<char>s2;
while(1){
gets(str);
int len=strlen(str);
if(len==1&&str[0]=='0') break;
while(!s1.empty()) s1.pop();
while(!s2.empty()) s2.pop();
for(int i=0;i<len;i++){
if(str[i]==' ') continue;
if(check(str[i])==2||check(str[i])==3){//如果当前是符号
while(!s2.empty()){
char c=s2.top();
if((check(c)==2&&check(str[i])==2)||check(c)==3){
//如果当前符号比栈顶符号的优先级高或者相同
//那么就计算栈顶符号的运算
double a=s1.top();
//取出符号右边的数
s1.pop();//删掉
double b=s1.top();
//取出符号左边的数
s1.pop();//删掉
double num;//计算后的结果
if(c=='+')
num=a+b;
else if(c=='-')
num=b-a;
else if(c=='*')
num=a*b;
else
num=b/a;
s1.push(num);//结果入栈
s2.pop();//把这个符号删掉
}
else break;
//当前符号比前面的符号优先级低
}
s2.push(str[i]);//将当前符号入栈
}
else{//如果当前是数字
int sum=0;
while(check(str[i])==1){//把两个符号之间的数从字符转化为数
sum=sum*10+str[i]-'0';
i++;
}
//cout<<sum<<endl;
s1.push((double)sum);
i--;//需要减回来
}
}
while(!s2.empty()){//再把栈内的符号和数字处理一次
char c=s2.top();
double a=s1.top();
s1.pop();
double b=s1.top();
double num;
s1.pop();
if(c=='+')
num=a+b;
else if(c=='-')
num=b-a;
else if(c=='*')
num=a*b;
else
num=b/a;
//cout<<b<<c<<a<<'='<<num<<endl;
s1.push(num);
s2.pop();
}
double ans=s1.top();
printf("%.2f\n",ans);
}
return 0;
}