逆波兰表达式求值
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例:
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
我们习惯的(4 + (13 / 5))的顺序是上图中序遍历的结果,而逆波兰式[“4”,“13”,“5”,"/","+"]是后序遍历的结果,好处是运算符只与之前的两个数字有关,而不必考虑运算符的优先级。
即“/”只与13和5有关,而“+”只与4和(13/5)有关。
因此我们只需要用一个栈来存储数字,每遇到一个数字就压栈,每遇到运算符就让栈顶的两个数字出栈,并将计算结果压入栈中,最后栈里就只剩下一个元素,也就是逆波兰式的最终结果。
C++代码如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
vector<int> num; //vector也可以实现栈的功能
int temp1, temp2; //临时存放栈顶的两个元素
for(int i = 0;i < tokens.size();i++)
{
if(isdigit(tokens[i][0])|| isdigit(tokens[i][1])) //做两次判断是为了避免将负数判断成运算符
{
num.push_back(stoi(tokens[i]));
}
else{
temp2 = num[num.size() - 1];
num.pop_back();
temp1 = num[num.size() - 1];
num.pop_back();
switch(tokens[i][0]){
case '+':num.push_back(temp1 + temp2);break;
case '-':num.push_back(temp1 - temp2);break;
case '/':num.push_back(temp1 / temp2);break;
case '*':num.push_back(temp1 * temp2);break;
}
}
}
return num[0];
}
};
有任何问题都可以在评论区和我交流~~