// 后缀表达式转中缀表达式,同时求值,O(n)// 数值栈
vector<int> nums;// 运算符栈
vector<char> ops;// 优先级 intgrade(char op){switch(op){case'(':return1;case'+':case'-':return2;case'*':case'/':return3;}return0;}// 处理后缀表达式中的一个运算符 voidcalc(char op){// 从栈顶取出两个数 int y =*nums.rbegin();
nums.pop_back();int x =*nums.rbegin();
nums.pop_back();int z;switch(op){case'+':
z = x + y;break;case'-':
z = x - y;break;case'*':
z = x * y;break;case'/':
z = x / y;break;}// 把运算结果放回栈中
nums.push_back(z);}// 中缀表达式转后缀表达式,同时对后缀表达式求值 intsolve(string s){
nums.clear();
ops.clear();int top =0, val =0;for(int i =0; i < s.size(); i++){// 中缀表达式的一个数字 if(s[i]>='0'&& s[i]<='9'){
val = val *10+ s[i]-'0';if(s[i+1]>='0'&& s[i+1]<='9')continue;// 后缀表达式的一个数,直接入栈
nums.push_back(val);
val =0;}// 中缀表达式的左括号 elseif(s[i]=='(') ops.push_back(s[i]);// 中缀表达式的右括号 elseif(s[i]==')'){while(*ops.rbegin()!='('){// 处理后缀表达式的一个运算符 calc(*ops.rbegin());
ops.pop_back();}
ops.pop_back();}// 中缀表达式的加减乘除号 else{while(ops.size()&&grade(*ops.rbegin())>=grade(s[i])){calc(*ops.rbegin());
ops.pop_back();}
ops.push_back(s[i]);}}while(ops.size()){calc(*ops.rbegin());
ops.pop_back();}// 后缀表达式栈中最后剩下的数就是答案 return*nums.begin();}