后缀表达式的计算方法
- 如果遇到操作数,将其压入操作数栈中;
- 如果遇到操作符,弹出操作数栈顶元素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 here
vector<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}
};
};