逆波兰式,更为人所知的名字是 “后缀表达式”。所谓后缀就是指运算算符写在操作数后面,我们平时习惯的 “中缀表达式” 是将运算符写在两个操作数之间。由于计算机内部就是采用后缀表达式的算法来计算表达式的值,所以实现此算法有着很高的现实意义。
要求后缀表达式的值,我们需要顺序扫描表达式的每一项,然后根据每一项的类型做对应的操作:若该项是操作数,将其压入工作栈中;若该项是操作符 op,则连续从栈中弹出两个操作数 y 和 x,计算 x op y,再将结果重新压入工作栈中。当表达式的所有项都扫描完后,工作栈顶存放的元素就是该表达式的结果。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
for(int i = 0; i < tokens.size(); i ++) {
if(tokens[i] == "+") {
int y = s.top();
s.pop();
int x = s.top();
s.pop();
s.push(x + y);
} else if(tokens[i] == "-") {
int y = s.top();
s.pop();
int x = s.top();
s.pop();
s.push(x - y);
} else if(tokens[i] == "*") {
int y = s.top();
s.pop();
int x = s.top();
s.pop();
s.push(x * y);
} else if(tokens[i] == "/") {
int y = s.top();
s.pop();
int x = s.top();
s.pop();
s.push(x / y);
} else {
s.push(stoi(tokens[i]));
}
}
return s.top();
}
stack<int> s;
};