LeetCode 算法题库【150】——逆波兰表达式求值

逆波兰表达式求值

题目描述:

ti
mu

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

1

  • 第二种: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()

2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值