返回
算法逆袭:巧解 LeetCode 150,逆波兰表达式求值!
前端
2024-01-07 12:36:38
引言
逆波兰表达式,又称后缀表达式,是一种不同寻常但高效的数学运算表示方式。它与我们熟悉的传统中缀表达式(例如,2 + 3 * 4)不同,逆波兰表达式将运算符置于操作数之后。例如,上面的表达式在逆波兰表示法中写为:2 3 4 * +.
在本文中,我们将踏上一段算法之旅,深入探讨如何使用逆波兰表达式求值。我们将从基础知识入手,逐步揭示 LeetCode 150 题目的精髓,并用直观的例子和清晰的代码实现来阐明解题思路。
逆波兰表达式的基础
逆波兰表达式具有明确的语法规则:
- 操作数直接写出。
- 运算符位于操作数之后。
- 运算符优先级由其位置确定。
例如,表达式 1 2 + 3 *
表示:首先计算 1 + 2
,然后将结果与 3
相乘。
LeetCode 150 题解
LeetCode 150 题目要求我们求解给定逆波兰表达式的值。我们可以使用栈数据结构来优雅地解决这个问题。
- 初始化一个栈: 它将用于存储运算数和中间结果。
- 遍历逆波兰表达式: 对于每个元素:
- 如果是操作数,则将其推入栈中。
- 如果是运算符,则弹出栈顶的两个元素,进行运算,并将结果推入栈中。
- 返回栈顶元素: 它就是表达式的值。
代码实现
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 题目的逆波兰表达式求值问题。逆波兰表达式的简洁性和高效性使它成为某些场景中的理想选择。掌握这种算法不仅能增强你的算法能力,还能拓宽你对数学表达式的理解。