概述

栈(Stack) 是一种遵循**后进先出(Last-In-First-Out, LIFO)**原则的动态集合。最后被压入(push)的元素将最先被弹出(pop),类似于桌上的一叠盘子——只能从顶部放入或取出。

定义

栈(Stack)

是一个支持以下操作的动态集合,其中属性 指向栈中最新插入的元素:

  • :若 ,返回 ;否则返回
  • :若 则报错 underflow;否则 ,返回

栈可以用数组 实现,其中 为栈的最大容量。 是一个整数索引,初始值为 ,表示栈为空。

核心性质

  • LIFO 原则:元素的出栈顺序与入栈顺序严格相反。
  • 操作复杂度 均为 时间。
  • 容量限制:数组实现需要预先分配固定大小 ,当 时发生 栈溢出(stack overflow)
  • 仅顶部可访问:栈不提供对中间或底部元素的直接访问。

操作示例

操作栈内容(底→顶)
初始0
Push(4)41
Push(1)4, 12
Pop() → 141
Push(3)4, 32

章节扩展

第10章:基于数组的实现

栈是 CLRS 第10章介绍的第一个基于数组的数据结构。其实现核心在于用数组索引 追踪栈顶位置,所有操作仅涉及对 的增减和数组的一次读写,因此每个操作均为常数时间。

栈在算法中有广泛应用:深度优先搜索(DFS)的递归调用栈、括号匹配、表达式求值、后缀表达式计算等。

第20章:基本图算法

DFS的递归实现隐式使用系统调用栈:每深入一层递归对应入栈,回溯对应出栈。栈深度最大为 O(V)。拓扑排序算法在DFS完成后,将顶点按完成时间逆序压入栈中(或链表头部插入),最终弹出顺序即为拓扑序。

参见

  • 队列 — 同为线性受限结构,但遵循 FIFO 原则
  • 链表 — 栈也可以用链表实现,无需预分配容量
  • 二叉堆 — 对比:堆同样基于数组实现,但支持更复杂的优先级操作