返回

算法逆袭:巧解 LeetCode 150,逆波兰表达式求值!

前端

引言

逆波兰表达式,又称后缀表达式,是一种不同寻常但高效的数学运算表示方式。它与我们熟悉的传统中缀表达式(例如,2 + 3 * 4)不同,逆波兰表达式将运算符置于操作数之后。例如,上面的表达式在逆波兰表示法中写为:2 3 4 * +.

在本文中,我们将踏上一段算法之旅,深入探讨如何使用逆波兰表达式求值。我们将从基础知识入手,逐步揭示 LeetCode 150 题目的精髓,并用直观的例子和清晰的代码实现来阐明解题思路。

逆波兰表达式的基础

逆波兰表达式具有明确的语法规则:

  • 操作数直接写出。
  • 运算符位于操作数之后。
  • 运算符优先级由其位置确定。

例如,表达式 1 2 + 3 * 表示:首先计算 1 + 2,然后将结果与 3 相乘。

LeetCode 150 题解

LeetCode 150 题目要求我们求解给定逆波兰表达式的值。我们可以使用栈数据结构来优雅地解决这个问题。

  1. 初始化一个栈: 它将用于存储运算数和中间结果。
  2. 遍历逆波兰表达式: 对于每个元素:
    • 如果是操作数,则将其推入栈中。
    • 如果是运算符,则弹出栈顶的两个元素,进行运算,并将结果推入栈中。
  3. 返回栈顶元素: 它就是表达式的值。

代码实现

def eval_rpn(tokens):
    stack = []
    operators = {'+', '-', '*', '/'}

    for token in tokens:
        if token in operators:
            op2 = stack.pop()
            op1 = stack.pop()
            result = do_math(token, op1, op2)
            stack.append(result)
        else:
            stack.append(int(token))

    return stack.pop()

def do_math(op, op1, op2):
    if op == '+':
        return op1 + op2
    elif op == '-':
        return op1 - op2
    elif op == '*':
        return op1 * op2
    else:
        return int(op1 / op2)

实例

让我们用几个例子来验证我们的代码:

  • 输入: [2, 3, 4, "+", "*"]
    输出: 14((2 + 3) * 4)

  • 输入: [4, 13, 5, "/", "+"]
    输出: 6(4 + (13 / 5))

  • 输入: [10, 6, 9, 3, "+", "-11, "*", "/", "*", 17, "+", 5, "+"]
    输出: 220(((10 + 6) * 9) / 3) - 11 * 17 + 5)

总结

通过使用栈数据结构,我们巧妙地解决了 LeetCode 150 题目的逆波兰表达式求值问题。逆波兰表达式的简洁性和高效性使它成为某些场景中的理想选择。掌握这种算法不仅能增强你的算法能力,还能拓宽你对数学表达式的理解。