D
AI
学习工作台
数据结构2026-05-221 分钟阅读

栈、队列与双端队列

LIFO/FIFO 语义、单调栈与 BFS 队列

队列双端队列单调栈面试记笔记标记疑惑

栈(Stack)

后进先出。数组 + top 或链表实现均可,操作均摊 O(1)。

有效括号

def is_valid(s):
    stack = []
    pair = {")": "(", "]": "[", "}": "{"}
    for ch in s:
        if ch in pair:
            if not stack or stack[-1] != pair[ch]:
                return False
            stack.pop()
        else:
            stack.append(ch)
    return not stack

单调栈:求每个元素左右第一个更大/更小。维护递减栈,遍历 nums[i] 时弹出 < nums[i] 的下标,弹出者以 i 为右边界答案。

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

队列(Queue)

先进先出。BFS、滑动窗口、任务调度。循环数组实现可避免假溢出:front/rear 取模。

from collections import deque

def bfs_level(root): if not root: return [] q = deque([root]) res = [] while q: level = [] for _ in range(len(q)): node = q.popleft() level.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) res.append(level) return res

双端队列(Deque)

两端 O(1) 入队出队。用于滑动窗口最值(维护单调递减下标队列)、0-1 BFSDijkstra 小优化

互实现(面试小题)

| 结构 | 实现思路 | |---|---| | 栈 → 队列 | 两个栈 in/out | | 队列 → 栈 | 两个队列,或用一个队列轮转 | | 最小栈 | 辅助栈同步最小值 |

练习:20、155、232、239、84(柱状图最大矩形 + 单调栈)。说清楚「栈里存什么」(值还是下标)是拿分关键。

知识卡片

问题

栈的典型应用场景?

点击翻转查看答案

答案

括号匹配、表达式求值、DFS 递归、单调栈求下一个更大元素、浏览器后退等 LIFO 场景。

问题

用两个栈如何实现队列?

点击翻转查看答案

答案

in 栈负责入队,out 栈负责出队;out 空时把 in 全部倒入 out,使先入先出顺序反转两次恢复 FIFO。

问题

单调栈维护什么不变量?

点击翻转查看答案

答案

栈内元素下标对应值单调递增(或递减),新元素入栈前弹出所有破坏单调性的项,被弹出的即「下一个更小/更大」的候选。