150. 逆波兰表达式求值
题意:
根据 逆波兰表示法,求表达式的值。
有效的算符包括
+
、-
、*
、/
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:
- 整数除法只保留整数部分。
- 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
示例 3:
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:
该算式转化为常见的中缀算术表达式为:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
解题思路:
利用栈完成表达式的相加减,
- 如果是数字直接压栈,注意string转为int需要用到stoi(string);
- 如果是运算符.需要让栈前面两个数字出栈并进行相应运算符的计算,计算结果需要重新压栈,
- 循环结束时,结果就存在栈顶,返回栈顶即可.
代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
for (const string str : tokens)
{
if (str != "+" && str != "-" && str != "*" && str != "/")
{
stk.push(stoi(str));
continue;
}
else
{
int x = stk.top();
stk.pop();
int y = stk.top();
stk.pop();
if (str == "+")
stk.push(y + x);
else if (str == "-")
stk.push(y - x);
else if (str == "*")
stk.push(y * x);
else if (str == "/")
stk.push(y / x);
}
}
return stk.top();
}
};
运行结果:
总结:
这是上数据结构课时讲过的,主要还是记住string转int型即可完成.