Skip to main content

核心认知

栈和队列都属于线性结构,但它们的重点不是“怎么存”,而是“怎么取”。 它们最重要的区别只有一条:
  • 栈是后进先出
  • 队列是先进先出
一旦这个顺序感建立起来,很多题就会变得非常直观。

栈是什么

栈可以理解成一摞盘子。
  • 新元素只能放到顶部
  • 取元素也只能从顶部取
最常见的操作是:
  • 入栈
  • 出栈
  • 查看栈顶
stack: list[int] = []
stack.append(1)
stack.append(2)
top = stack.pop()   # 2
Python 里,普通 list 就可以直接当栈用。

队列是什么

队列可以理解成排队。
  • 后来的人排到后面
  • 先来的人先处理
最常见的操作是:
  • 入队
  • 出队
  • 查看队头
from collections import deque

queue = deque()
queue.append(1)
queue.append(2)
front = queue.popleft()   # 1
Python 里做队列时,更推荐 collections.deque,而不是直接用 list

为什么栈和队列题这么常见

因为很多题目本质上都在维护“访问顺序”。 例如:
  • 最近的状态先处理,常常想到栈
  • 一层一层扩散处理,常常想到队列
这也是为什么:
  • 单调栈
  • 单调队列
  • BFS
都会归到这一类结构里。

常见题型

栈与队列题通常集中在这些方向:
  • 括号匹配
  • 单调栈
  • 单调队列
  • BFS
  • 用栈实现队列
  • 用队列实现栈
其中单调栈和单调队列是最值得重点掌握的进阶内容。

一个经典的 Python 例子

有效括号是栈题里最基础的模型。
def is_valid(s: str) -> bool:
    pairs = {')': '(', ']': '[', '}': '{'}
    stack: list[str] = []

    for ch in s:
        if ch in '([{':
            stack.append(ch)
        else:
            if not stack or stack[-1] != pairs[ch]:
                return False
            stack.pop()

    return not stack
这类题的关键不是“匹配字符”,而是“用栈维护最近还没闭合的状态”。

学习建议

建议按这个顺序练:
  • 有效括号
  • 用栈实现队列
  • 用队列实现栈
  • 删除字符串中的相邻重复项
  • 单调栈基础题
  • 滑动窗口最大值
当你开始从“顺序规则”去看问题,而不是从“数据长什么样”去看问题,栈和队列就会真正变成工具。