← 返回目录

📚

第三章:栈与队列

掌握后进先出、先进先出和单调结构

队列deque

本章目标

本章学习栈、队列和单调栈。它们都限制元素进出的方向,用简单规则换来清晰的状态管理。

你会用栈处理括号匹配,用队列维护先进先出流程,用单调栈寻找下一个更大元素。

核心概念

栈是后进先出,适合处理最近打开、最近未完成的问题。括号匹配、函数调用、撤销操作都能用栈建模。

队列是先进先出,适合按到达顺序处理任务。Python 推荐用 collections.deque 做两端 O(1) 的追加和弹出。

关键点:单调栈不是新容器,而是在栈内维持单调性,弹出的那一刻就能确定答案。

Python 示例

deque 可以高效实现队列操作,避免 list.pop(0) 的 O(n) 移动。

from collections import deque

queue = deque(["a", "b"])
queue.append("c")
first = queue.popleft()  # O(1)

括号匹配使用栈保存等待闭合的左括号;单调栈可以求每个元素右侧第一个更大值。

def next_greater(nums):
    ans = [-1] * len(nums)
    stack = []
    for i, x in enumerate(nums):
        while stack and nums[stack[-1]] < x:
            ans[stack.pop()] = x
        stack.append(i)
    return ans

复杂度与常见误区

栈和队列的单次入队、出队通常是 O(1)。单调栈里每个元素最多入栈一次、出栈一次,所以总时间是 O(n)。

常见误区是看到 while 就认为是 O(n^2)。单调栈的 while 弹出的是未来不会再出现的元素,总次数可摊还分析。

本章要点

栈解决最近依赖,队列解决顺序处理,deque 是 Python 中实现两者的常用工具。

单调结构的核心是维护一个对答案有用的候选集合,把无用候选及时删除。

评论加载中...