leetcode代码记录(逆波兰表达式求值

简介: leetcode代码记录(逆波兰表达式求值

1. 题目:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。

每个操作数(运算对象)都可以是一个整数或者另一个表达式。

两个整数之间的除法总是 向零截断 。

表达式中不含除零运算。

输入是一个根据逆波兰表示法表示的算术表达式。

答案及所有中间计算结果可以用 32 位 整数表示。

示例 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

2. 我的代码:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        # 栈
        stack = []
        # 操作符对应的函数
        operation = {"+": lambda x, y: x + y, "-": lambda x, y: x - y, "*": lambda x, y: x * y, "/": lambda x, y: int(x / y)}
        # 循环
        for i in tokens:
            if i in operation:
                num2 = stack.pop()
                num1 = stack.pop()
                stack.append(operation[i](num1, num2))
            else:
                stack.append(int(i))
        
        return stack[0]

逆波兰表达式换句话说就是后序遍历二叉树,优点在于可以利用栈方便地计算表达式的值。

利用栈,当遇到操作符时,将倒数第二个和倒数第一个数字进行操作符运算,然后再存入栈;如果时数字,则转换为整数后放入栈。

难点在于:除法的写法是:"/": lambda x, y: int(x / y),而不是//,就比较奇怪,int(1 / -20) = 01 // 20 = -1

目录
相关文章
|
3月前
|
算法 测试技术
力扣经典150题第五十五题:逆波兰表达式求值
力扣经典150题第五十五题:逆波兰表达式求值
40 1
|
4月前
力扣-2029-石子游戏-‘屎山’代码
力扣-2029-石子游戏-‘屎山’代码
37 3
|
5月前
|
算法
leetcode代码记录(全排列 II
leetcode代码记录(全排列 II
43 4
|
5月前
leetcode代码记录(最长回文子串
leetcode代码记录(最长回文子串
43 2
|
5月前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
41 2
|
5月前
|
算法
leetcode代码记录(全排列
leetcode代码记录(全排列
45 1
|
5月前
|
索引
leetcode代码记录(Z 字形变换
leetcode代码记录(Z 字形变换
39 1
|
5月前
leetcode代码记录(回文数
leetcode代码记录(回文数
36 1
|
5月前
leetcode代码记录(两数之和
leetcode代码记录(两数之和
33 1
|
5月前
|
索引
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
50 0