逆波兰表达式求值
题目描述:
解题思路:
- 第一种:迭代遍历。这道题难度并不是很大,考验的是我们熟练掌握栈的方法来解决四则运算的问题。思路就是我们先从头开始遍历字符串,如果遇到数字,那么就先放入栈中,当我们第一次遇到四则运算符号时,我们就将前两个元素
pop
出来,这里则将栈顶两个元素pop
出来就很方便,体现了栈的思想方法。之后就进行分类讨论,每一种运算符对应的运算写出来,然后将这个结果再次放入栈中,也就是处于栈顶的位置,同理后面的问题也就迎刃而解了。 - 这里我们需要注意几点:第一,我们在运算减法和除法时,要注意减数和被减数以及除数和被除数的位置,如果反了,就会输出错误,就比如代码中的
b - a
不能写成a - b
。第二,我们在运算除法时,可以从例子中看到,这里是整除的,没有带小数,而python3
的除法运算比较高级,它直接就将小数运算出来,所以为了得到整除的结果,需要在前面加上int
。第三,在我们将字符串中非四则运算符的数字放入栈中时,应当考虑到这个数字不是整型的,而是字符串类型的,所以我们需要在前面加上int
来强制转换类型,不然最后输出的就是字符串类型,也是错误的答案。 - 时间复杂度:O(N)
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
if not tokens:
return 0
stack = []
for i in tokens:
if i in ['+', '-', '*', '/']:
a = int(stack.pop())
b = int(stack.pop())
if i == '+':
temp = b + a # stark.append(b + a)
if i == '-':
temp = b - a # stark.append(b - a)
if i == '*':
temp = b * a # stark.append(b * a)
if i == '/':
temp = int(b / a) # stark.append(int(b / a))
stack.append(temp)
else:
stack.append(int(i))
return stack[-1] # stack.pop()
- 第二种:Operator方法。这里用到了
python
的模块operator
,对这个模块不熟悉可以看看这个:operator标准运算符替代函数。这里我们通过这个模块,建立每个四则运算符所代表的含义,之后的方法就和第一种没差了。 - 这里也要注意,因为
python3
返回会自带小数,所以要注意强制性转化为整型再返回。 - 时间复杂度:O(N)
import operator
class Solution2:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
Opera = {"+": operator.add, "-": operator.sub, "*": operator.mul, "/": operator.truediv}
for i in tokens:
if i in Opera:
a = int(stack.pop())
b = int(stack.pop())
stack.append(int(Opera[i](b, a)))
else:
stack.append(int(i))
return stack.pop()