表达式求值
#include <iostream>
#include <string>
#include <stack>
using namespace std;
//获取操作符的优先级
int getBigger(char operate){
if(operate == '+' || operate == '-'){
return 2;
}else if(operate == '*' || operate == '/'){
return 3;
}else if(operate == '#'){
return 0;
}else if(operate == '$'){
return 1;
}
}
//计算两个数字的值
int caculate(double x,double y,char oper){
if(oper == '+'){
return x + y;
}else if(oper == '-'){
return x - y;
}else if(oper == '*'){
return x * y;
}else if(oper == '/'){
return x /y;
}
}
int main(){
string str;
while(getline(cin,str)){
if(str == "0"){
break;
}
int index;
stack<char> operate;
stack<double> data;
operate.push('#');
str+='$';
while(index < str.size()){
if(str[index] == ' '){
index++;
}else if(str[index] >= '0' && str[index] <= '9'){
//判断该数字字符是否是一个连续的数字
double num = 0;
while(str[index] >= '0' && str[index] <= '9'){
num = num * 10 + str[index] - '0';
index++;
}
//将数字压入栈中
data.push(num);
}else{
//是操作符
//如果当前的操作符比栈中的操作付大则直接进栈
//否则将栈中的操作符出栈并计算数值
if(getBigger(str[index]) > getBigger(operate.top())){
operate.push(str[index++]);
}else{
//将数字栈中的数字进行出栈
double x = data.top();
data.pop();
double y = data.top();
data.pop();
//将符号栈中的数字进行出栈
char oper = operate.top();
operate.pop();
//计算值 并将计算的值入栈
data.push(caculate(y,x,oper));
}
}
}
printf("%.2f",data.top());
}
}