1. 栈与队列算法专题收官之战
今天我们要解决栈与队列专题的最后三道压轴题:LC 150(逆波兰表达式求值)、LC 239(滑动窗口最大值)和 LC 347(前K个高频元素)。这三道题分别代表了栈与队列应用的三个重要方向,每道题都有其独特的解题思路和实现技巧。
作为算法工程师,我经常在面试中遇到这三类问题。它们不仅是面试高频考点,更是实际工程中常用的算法范式。比如电商平台的实时热销商品排行、金融系统的滑动窗口风控计算、编译器中的表达式求值等场景,都会用到这些算法思想。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LC 150 · 逆波兰表达式求值
2.1 逆波兰表达式简介
逆波兰表达式(Reverse Polish Notation,RPN),也叫后缀表达式,是一种不需要括号就能明确运算顺序的数学表达式表示方法。它的核心特点是运算符位于两个操作数之后。
例如:
- 常规表达式:(2 + 3) × 4
- 逆波兰表达式:2 3 + 4 ×
这种表示法最大的优势是完全消除了运算符优先级和括号的歧义,特别适合用栈结构来计算。
2.2 栈模拟计算过程
实现逆波兰表达式求值的算法非常直观:
- 初始化一个空栈
- 遍历表达式中的每个token:
- 如果是数字:压入栈中
- 如果是运算符:弹出栈顶两个元素,进行运算,将结果压回栈中
- 最后栈中剩下的唯一元素就是表达式结果
python复制def evalRPN(tokens):
stack = []
for token in tokens:
if token not in '+-*/':
stack.append(int(token))
else:
b = stack.pop()
a = stack.pop()
if token == '+':
stack.append(a + b)
elif token == '-':
stack.append(a - b)
elif token == '*':
stack
