#include <cstdio>
#include <stack>
#include <map>
using namespace std;
int main(){
char buf[300];
map<char, int> priority{
{'$',0},
{'+',1},{'-',1},
{'*',2},{'/',2}
};
while(fgets(buf, 300, stdin) != NULL){
string expr;
expr = buf;
expr.pop_back(); //去掉fgets函数最后读入的\n
if(expr == "0"){
break;
}
expr.push_back('$');//补充一个虚拟的终止运算符
stack<char> operStack; //操作符栈
stack<double> numStack; //操作数栈
string num = "";
for(unsigned i = 0; i < expr.size(); ++i){
//读入表达式并处理求取结果
//运算操作数合并压栈
if(expr[i]>='0'&&expr[i]<='9'){
num.push_back(expr[i]);
}
else if(expr[i] == ' '){
if(num != ""){
numStack.push(stod(num));
num = "";
}
}
else{
// $ + - * /
if(expr[i] == '$'){
numStack.push(stod(num));
num = "";
}
while(!operStack.empty() && priority[operStack.top()]>=priority[expr[i]]){
char oper = operStack.top();
operStack.pop();
double rhs = numStack.top();
numStack.pop();
double lhs = numStack.top();
numStack.pop();
switch(oper){
case'+':
numStack.push(lhs + rhs);
break;
case'-':
numStack.push(lhs - rhs);
break;
case'*':
numStack.push(lhs * rhs);
break;
case'/':
numStack.push(lhs/rhs);
break;
}
}
operStack.push(expr[i]);
}
}
printf("%.2f\n", numStack.top());
}
}
输入示例
1 + 2
4 + 2 * 5 - 7 / 11
0
输出示例
3.00
13.36