栈Stack
按后进先出顺序保存与取出元素。
- 核心约束
- 只在栈顶插入和移除。
- 适用问题
- 嵌套处理、遍历状态、回溯与调用管理。
- 边界与取舍
- 访问底部元素通常需要额外操作。
常见操作#
n 为栈内元素数。
| 操作 | 时间复杂度 | 条件与说明 |
|---|---|---|
| 查看栈顶 | 只读最后入栈的元素,不移除。 | |
| 压栈 | 摊还 ;扩容最坏 | 动态数组实现;链式实现更新栈顶为 ,分配成本另计。 |
| 弹栈 | 不触发缩容的数组栈或链式栈;带缩容的数组栈按摊还分析。 | |
| 遍历 / 查找任意元素 | 最坏访问全部元素;这些操作不属于栈的核心接口。 |
时间与空间#
- 时间复杂度
- 核心操作为常数或摊还常数时间
- 存储空间
动态数组和链表都可实现栈,但扩容、分配和局部性不同。
工程中的应用#
2 个案例 · 附源码Linux BPF 验证器的 check_cfg 使用显式指令栈执行非递归 DFS,检查跳转目标、可达性及控制流结构。
附源码片段 · 图处理与编译
LLVM 的 legacy 调用图 pass 管理器使用 Tarjan SCC 迭代器,将相互递归的函数作为一组,并按被调用方优先的顺序处理分组。
附源码片段 · 图处理与编译