逆波兰表达式求值
题目描述:


解题思路:
- 第一种:迭代遍历。这道题难度并不是很大,考验的是我们熟练掌握栈的方法来解决四则运算的问题。思路就是我们先从头开始遍历字符串,如果遇到数字,那么就先放入栈中,当我们第一次遇到四则运算符号时,我们就将前两个元素
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()

本文详细介绍了如何使用栈解决逆波兰表达式求值问题,包括两种方法:迭代遍历和Operator方法。通过实例解析,阐述了算法的实现细节,如数字与运算符的处理、类型转换及四则运算的正确顺序。
1740

被折叠的 条评论
为什么被折叠?



