和前面的一样,我们先看下题目的要求:
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9
示例 2:
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6
示例 3:
输入: ["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
= 22
通过题目的要求:我们可以理解题目的要求,但是该有什么样的思路解决这一道问题呢?有什么思路吗?
我们使用的是:《 中缀转后缀》
我们来分析一下:
首先是:我们要知道,题目的优先级顺序,‘+’,‘ - ’ 为一个优先级,‘*’,‘ / ’为一个优先级;
第二部:我们应该怎么样实现一个判断优先级,那么现在我们就用一个栈,来实现,遇到第一个数,先入栈,然后,继续往下面走,遇到第一操作符,先入栈,遇到第一个操作符,先入栈,然后查看第二给值 ,继续放栈里面,然后继续操作符,判断与第一个操作符的优先级关系,是否优先,计算,然后入栈,和上面的重复就行了。
画的不太好,嘿嘿,大概理解一下;
第三步;
大多的时候,不仅仅是加减乘除,还有括号,那么,括号的优先级怎么样?
这里说明一下,括号的优先级比较低,遇到括号,不用管,直接继续计算。
下面,我们看一下实现的代码:
class Solution {
public:
int evalRPN(vector& tokens) {
stack st;
//首先先遍历一遍:
for(const auto& str : tokens)
{
if(str == "+" || str == "-" || str == "*" || str == "/")
{
int right = st.top();
st.pop();
int left = st.top();
st.pop();
switch(str[0])
{
case '+':
st.push(left + right);
break;
case '-':
st.push(left - right);
break;
case '*':
st.push(left * right);
break;
case '/':
st.push(left / right);
break;
}
}
else
{
st.push(atoi(str.c_str())); //把字符串转成整形;
}
}
return st.top();
}
};
这段程序我也有了一点的补充,所以理解是没有问题了,那么可以自己实现以下了。