leetcode链接:逆波兰表达式求值
思路:
假设这样一组表达式 { "2" , "1" , "+" , "3" , "*" }
这是一种后缀表达式,首先我们准备一个栈,当如果不是操作符的时候我们就把当前操作数入栈,所以在这一组表达式中 "2" , "1"
不是入栈。入栈的时候我们把 string
转换成 int
使用 stoi()
这样等会更方便我们控制。stack => {2 , 1}
,当我们遇到操作符的时候,就出栈两次取左右操作数,由于栈是先进后出所以先取出来的是右操作数(对于 + *
操作符操作数的顺序没有影响,但是 - /
会有顺序之分 )
取出来之后,我们将两个操作数与操作符计算,计算出来的结果继续入栈。stack => {3}
,继续 "3"
不是操作符入栈,stack => {3 , 3}
,"*"
是操作符取出栈顶两个元素计算, stack => {9}
最后循环遍历结束,所以最后结果是在栈顶 top
位置上。
代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> filter;
// 使用栈
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] == "+" ||
tokens[i] == "-" ||
tokens[i] == "*" ||
tokens[i] == "/"
) {
// 取出左右栈操作数
int right = filter.top();
filter.pop();
int left = filter.top();
filter.pop();
switch (tokens[i].front()) {
case '+':
filter.push(left + right);
break;
case '-':
filter.push(left - right);
break;
case '*':
filter.push(left * right);
break;
case '/':
filter.push(left / right);
break;
}
} else {
// 不是操作符入栈
filter.push(stoi(tokens[i]));
}
}
// 最终结果在栈顶
return filter.top();
}
};