#include<stack> #include<string> #include<cstdio> #include<map> using namespace std; int main(){ char buf[300]={'\0'}; map<char,int> priority;//优先级用map进行管理 priority.insert(pair<char,int>('$',0)); priority.insert(pair<char,int>('+',1)); priority.insert(pair<char,int>('-',1)); priority.insert(pair<char,int>('*',2)); priority.insert(pair<char,int>('/',2)); while(fgets(buf,300,stdin) != NULL){ string expr = buf; expr.pop_back(); if(expr == "0"){ break; } expr.push_back('$');//补充一个虚拟的终止符 string num;//用来收集单独的0-9以组成一个数字1 2 3 4 --> 1234 stack<double>numstack; stack<char> operstack; for(unsigned i = 0; i < expr.size(); ++i){ if(expr[i] >= '0' && expr[i] <= '9'){ num.push_back(expr[i]); } else if(expr[i] == ' '){//number有内容才生成数字 if(num != ""){ numstack.push(stod(num));//string to double num =""; } } else{ //得到的字符是+ - * / $ if(expr[i] == '$'){//把最后的数字字符变成数字 if(num != ""){ 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; } } //使得优先级比expr[i]更高都运算符全都计算过了 operstack.push(expr[i]); } } printf("%.2lf\n",numstack.top()); } }