#include<iostream> using namespace std; #include<string> #include<stack> #include<map> #include<algorithm> stack<float>num;//存数据 stack<char>op;//存操作符 //取(pop)num中两个数据 与 op中一个操作符做运算 并将结果放入(push)栈顶 void eval(){ //注意a b顺序 auto b=num.top();num.pop(); auto a=num.top();num.pop(); auto c=op.top();op.pop(); float x; if(c=='+') x=a+b; else if(c=='-') x=a-b; else if(c=='*') x=a*b; else x=a/b; num.push(x); } int main() { //定义优先级 map<char,int> pre{{'+',1},{'-',1},{'*',2},{'/',2}}; string a; cin>>a; //if(a=="0") return 0; for(int i=0;i<a.size();i++){ //判断是否是数据 并读入栈底 模板 auto c=a[i]; if(isdigit(c)){ float x=0,j=i; while(j<a.size()&&isdigit(a[j])) x=x*10+a[j++]-'0'; i=j-1; num.push(x); } //else if(a[i]==' ') continue; else{//操作符入op //当栈存在 且栈顶元素优先级大于该元素则出栈eval while(op.size()&&pre[op.top()]>=pre[c]) eval(); //否则入栈该元素 op.push(c); } } //易漏 当op不为空时,还要继续计算 while(op.size()) eval(); printf("%.0f",num.top()); }