本文档涵盖了使用栈和队列数据结构的常见面试问题。它概述了典型的问题模式、示例问题、解决方案方法和实现细节。有关数据结构基础的通用信息,请参阅线性数据结构。
栈是一种后进先出(LIFO)的数据结构,支持两种主要操作:
其他操作包括:
来源:leetcode/stack/ExclusiveTimeOfFunctions.java, leetcode/stack/DailyTemperatures.java
队列是一种先进先出(FIFO)的数据结构,支持两种主要操作:
其他操作包括:
| 模式 | 描述 | 示例问题 |
|---|---|---|
| 单调栈 | 保持元素递增或递减顺序的栈 | 每日温度 |
| 表达式求值 | 计算算术表达式 | 计算器,逆波兰表示法 |
| 括号匹配 | 验证匹配的括号或方括号 | 有效的括号 |
| 函数调用模拟 | 使用栈模拟函数调用 | 函数的独占时间 |
| 最小/最大栈 | 带额外最小/最大操作的栈 | 最小栈 |
| 模式 | 描述 | 示例问题 |
|---|---|---|
| BFS 遍历 | 图/树的层序遍历 | 层序遍历 |
| 任务调度 | 调度和处理任务 | 任务调度器 |
| 滑动窗口 | 维护一个元素窗口 | 移动平均,滑动窗口最大值 |
问题: 设计一个栈,支持 push、pop、top 操作,并能在常数时间内检索到最小元素。
方法示意图
实现细节
data)min)next)getMin() 操作简单地返回栈顶节点的 min 值示例流程
来源:leetcode/design/MinStack.java:15-55
问题: 给定一个每日温度数组,对于每一天,找出你需要等待多少天才能等到一个更温暖的温度。
方法示意图
实现细节
示例: 输入:[73, 74, 75, 71, 69, 72, 76, 73] 输出:[1, 1, 4, 2, 1, 1, 0, 0]
来源:leetcode/stack/DailyTemperatures.java:7-21
问题: 给定格式为 id:start/end:timestamp 的函数执行日志,计算每个函数的独占执行时间。
方法示意图
关键实现点
示例: 对于日志:["0:start:0", "1:start:2", "1:end:5", "0:end:6"] 输出:[3, 4](函数 0 运行 3 个时间单位,函数 1 运行 4 个时间单位)
来源:leetcode/stack/ExclusiveTimeOfFunctions.java:30-55
栈特别适用于:
队列特别适用于:
| 数据结构 | 操作 | 时间复杂度 |
|---|---|---|
| 栈 | push | O(1) |
| 栈 | pop | O(1) |
| 栈 | peek/top | O(1) |
| 栈 | isEmpty | O(1) |
| 队列 | enqueue/add | O(1) |
| 队列 | dequeue/remove | O(1) |
| 队列 | peek/front | O(1) |
| 队列 | isEmpty | O(1) |
栈的实现选择:
Stack 类:Stack<Integer> stack = new Stack<>();ArrayDeque 用作栈:Deque<Integer> stack = new ArrayDeque<>();队列的实现选择:
Queue 接口与 LinkedList:Queue<Integer> queue = new LinkedList<>();ArrayDeque:Queue<Integer> queue = new ArrayDeque<>();常见错误:
来源:leetcode/stack/ExclusiveTimeOfFunctions.java, leetcode/stack/DailyTemperatures.java, leetcode/design/MinStack.java