栈Stack

按后进先出顺序保存与取出元素。

核心约束
只在栈顶插入和移除。
适用问题
嵌套处理、遍历状态、回溯与调用管理。
边界与取舍
访问底部元素通常需要额外操作。
A · 栈底BC · 栈顶D · 待入栈C · 出栈push 入栈pop 出栈
入栈和出栈都操作栈顶。当前 pop 得到 C;若先 push D,下一次 pop 得到 D。

常见操作#

n 为栈内元素数。

操作时间复杂度条件与说明
查看栈顶O(1)O(1)只读最后入栈的元素,不移除。
压栈摊还 O(1)O(1);扩容最坏 O(n)O(n)动态数组实现;链式实现更新栈顶为 O(1)O(1),分配成本另计。
弹栈O(1)O(1)不触发缩容的数组栈或链式栈;带缩容的数组栈按摊还分析。
遍历 / 查找任意元素O(n)O(n)最坏访问全部元素;这些操作不属于栈的核心接口。

时间与空间#

时间复杂度
核心操作为常数或摊还常数时间
存储空间
O(n)O(n)

动态数组和链表都可实现栈,但扩容、分配和局部性不同。

工程中的应用#

2 个案例 · 附源码
基础原理参考资料

Princeton · ResizingArrayStack动态数组栈的压栈、弹栈与摊还保证。

Princeton · Stack链式栈的常数时间接口。

7 个概念