后缀表达式的计算方法
- 如果遇到操作数,将其压入操作数栈中;
- 如果遇到操作符,弹出操作数栈顶元素b,再弹出下一个操作数栈顶元素a,执行运算
a 操作符 b,并将结果入栈; - 最后操作数栈只剩最后一个元素,即为表达式的值
示例:1 2 3 * - 4 5 6 - * 7 + 8 / + 9 +
- 1 2 3 依次入栈
- 操作数栈为
[1 2 3]
- 遇到操作符,弹出3、弹出2,执行23,结果为6,6入栈
- 操作数栈为
[1 6]
- 遇到操作符-,弹出6、弹出1,执行1-6,结果为-5,-5入栈
- 操作数栈为
[-5]
- 4 5 6 依次入栈
- 操作数栈为
[-5 4 5 6]
- 遇到操作符-,弹出6、弹出5,执行5-6,结果为-1,-1入栈
- 操作数栈为
[-5 4 -1]
- 遇到操作符,弹出-1、弹出4,执行4-1,结果为-4,-4入栈
- 操作数栈为
[-5 -4]
- 7入栈
- 操作数栈为
[-5 -4 7]
- 遇到操作符+,弹出7、弹出-4,执行7+-4,结果为3,3入栈
- 操作数栈为
[-5 3]
- 8入栈
- 操作数栈为
[-5 3 8]
- 遇到操作符/,弹出8、弹出3,执行3/8,结果为0,0入栈
- 操作数栈为
[-5 0]
- 遇到操作符+,弹出0、弹出-5,执行-5+0,结果为-5,-5入栈
- 操作数栈为
[-5]
- 9入栈
- 操作数栈为
[-5 9]
- 遇到操作符+,弹出9、弹出-5,执行-5+9,结果为4,4入栈
- 操作数栈为
[4]
- 表达式最终值为4
结束
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* 返回表达式的值* @param s string字符串 待计算的表达式* @return int整型*/int solve(string s) {// write code herevector<string> infOrder, sufOrder;this->strParser(s, infOrder);printVector(infOrder);this->infill2suffix(infOrder, sufOrder);printVector(sufOrder);return this->suffix2val(sufOrder);}int suffix2val(vector<string>& sufOrder){// 后缀表达式求值stack<int> numStack;int a, b;for(string str : sufOrder){if(isOperator(str)){b = numStack.top();numStack.pop();a = numStack.top();numStack.pop();if(str == "+"){numStack.push(a + b);}else if(str == "-"){numStack.push(a - b);}else if(str == "*"){numStack.push(a * b);}else{numStack.push(a / b);}}else{numStack.push(atoi(str.c_str()));}}return numStack.top();}void infill2suffix(vector<string>& infOrder, vector<string>& sufOrder){// 中缀表达式转后缀表达式sufOrder.clear();stack<string> opStack;for(string str : infOrder){if(isOperator(str)){if(opStack.empty() || str=="("){opStack.push(str);}else if(str == ")"){while(opStack.top() != "("){sufOrder.push_back(opStack.top());opStack.pop();}opStack.pop();}else{while(!opStack.empty() && isHigherOperator(opStack.top(), str)){sufOrder.push_back(opStack.top());opStack.pop();}opStack.push(str);}}else{sufOrder.push_back(str);}}while(!opStack.empty()){sufOrder.push_back(opStack.top());opStack.pop();}}void strParser(string& s, vector<string>& ret){// 解析字符串,将数字和符号分开string curStr = "";for(char ch : s){if(ch >= '0' && ch <= '9'){curStr += ch;}else{if(curStr != ""){ret.push_back(curStr);}ret.push_back(string(1, ch));curStr = "";}}if(curStr != ""){ret.push_back(curStr);}}bool isOperator(string& op){for(int i=0; i<this->ops.size(); i++){if(op == this->ops[i]){return true;}}return false;}bool isHigherOperator(string& op1, string& op2){// 判断op1是否比op2的优先级较高return this->opsPriority[op1] >= this->opsPriority[op2];}private:vector<string> ops={"+", "-", "*", "/", "(", ")"};map<string, int> opsPriority = {{"(", 0},{"+", 1}, {"-", 1},{"*", 2}, {"/", 2}};};
