2025/3/5 【栈与队列】 LeetCode150.逆波兰表达式求值

代码随想录

150. 逆波兰表达式求值 - 力扣(LeetCode)

知识点1:递归就是用栈来实现的。

知识点2:逆波兰表达式是用后序遍历的方式把二叉树序列化了。

知识点3:将字符串形式的数字转换为实际的数字(整数或浮点数)在Python中是非常直接的操作,可以使用内置函数int()float()来实现。

知识点4:要将字符串中的运算符转化为能够执行实际计算作用的运算符,可以使用一个映射(如字典)将字符形式的运算符转换为实际可以调用的函数。如代码一。

解法:用栈操作运算,遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

代码一:

复制代码
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        
        eva = {
            '+': lambda x, y: x + y,
            '-': lambda x, y: x - y,
            '*': lambda x, y: x * y,
            '/': lambda x, y: x / y
        }
        for item in tokens:
            if item in eva.keys():
                y = stack.pop()
                x = stack.pop()
                print(f"x, y{x, y}")
                num = eva[item](x, y)
                stack.append(int(num))
            else:
                stack.append(int(item))
        
        return stack[0]
        
复制代码

代码二:代码随想录,考虑到了负数的情况

from operator import add, sub, mul 是 Python 中的一条导入语句,用于从 Python 内置的 operator 模块中导入三个函数:addsub 和 mul。这些函数分别用于执行加法、减法和乘法操作。

  • truediv(a, b):对应除法 /

  • floordiv(a, b):对应整除 //

复制代码
from operator import add, sub, mul

def div(x, y):
    return x / y if x*y > 0 else -(abs(x) / abs(y))

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        op_map = {
            '+' : add,
            '-' : sub,
            '*' : mul,
            '/' : div
        }
        stack = []
        for token in tokens:
            if token in op_map.keys():
                op2 = stack.pop()
                op1 = stack.pop()
                stack.append(int(op_map[token](op1, op2)))
            else:
                stack.append(int(token))
        
        return stack.pop()
        
复制代码

代码三:代码随想录。

可行,但因为使用eval()相对较慢的方法,eval() 可以将一个字符串形式的表达式转换为实际的 Python 表达式,并返回该表达式的计算结果。

复制代码
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            # 判断是否为数字,因为isdigit()不识别负数,故需要排除第一位的符号
            if token.isdigit() or (len(token) > 1 and token[1].isdigit()):
                stack.append(token)
                print(token)
            else:
                op2 = stack.pop()
                op1 = stack.pop()
                # (op1 + token + op2)是字符串表达式,eval函数返回的是数值,所以需要str()
                stack.append(str(int(eval(op1 + token + op2))))
        
        return int(stack.pop())
        
复制代码

观点:做这一题学到了不少内置函数。int(), eval(), str(), from operator import add, sub, mul, truediv, floordiv, str.isdigit(), lambda 表达式,判断字符串内容是不是负数。

posted @   axuu  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示