leetcode(力扣) 150. 逆波兰表达式求值 (栈的运用)

本文介绍了一个使用栈解决逆波兰表达式求值问题的算法。通过遍历输入的令牌序列,遇到数字则压入栈,遇到运算符则进行相应的加、减、乘、除操作。在除法中特别注意只保留整数部分。文章通过示例详细解释了算法的运行过程,并提供了完整的Python代码实现。
摘要由CSDN通过智能技术生成

题目描述

根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:
输入:tokens = [“2”,“1”,“+”,“3”,“*”]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:
输入:tokens = [“4”,“13”,“5”,“/”,“+”]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:
输入:tokens = [“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

思路分析

这明显是个栈的题。 也没必要知道逆波兰表达式是啥,学过数据结构的应该都会,中缀后缀表达式转换选择题经常有。

直接来个清晰易懂的例子:
使用示例1,
tokens = [“2”,“1”,“+”,“3”,“*”]

建立栈stack = []

遇到数字就进栈, 遇到计算符就计算倒数第二个和倒数第一个之间的数值结果,然后将该结果进栈。

  • 遇到2进栈,遇到1进栈。 此时栈里 stack = [2,1]
  • 遇到 ‘+’ 号计算符 将前两个出栈 做加运算,2+1=3
  • 将计算结果进栈 此时栈里 stack = [3]
  • 在遇到3 进栈 此时栈里 stack = [3,3]
  • 遇到 ‘*’ 取出栈里的 3 * 3 = 9 ,在进栈 stack = [9]

这就是整体过程。

只有一个要注意的点,就是 运算顺序是 倒数第二个和倒数第一个的运算,也就是 stack[-2] 与 stack[-1] 在减法的除法的时候尤其注意。

完整代码

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
            stack = []
            for i in tokens:
                if i == '+':
                    stack.append(int(stack.pop()) + int(stack.pop()))
                elif i == '-':
                    temp = int(stack[-2]) - int(stack[-1])
                    stack.pop()
                    stack.pop()
                    stack.append(temp)
                elif i == '*':
                    stack.append(int(stack.pop()) * int(stack.pop()))
                elif i == '/':
                    stack.append(1/int(stack.pop()) * int(stack.pop()))
                else:
                    stack.append(i)
            return int(stack[0])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值