数据结构 / stack

本地源文件:docs/ds__stack.md

引入

栈是 OI 中常用的一种线性数据结构.请注意,本文主要讲的是栈这种数据结构,而非程序运行时的系统栈/栈空间.

栈的修改与访问是按照后进先出的原则进行的,因此栈通常被称为是后进先出(last in first out)表,简称 LIFO 表.

Warning

LIFO 表达的是 当前在容器 内最后进来的最先出去.

我们考虑这样一个栈

---|---

如果从整体考虑,1 最先入栈,最先出栈,2 最后入栈,最后出栈,这样就成了一个先进先出表,显然是错误的.

所以,在考虑数据结构是 LIFO 还是 FIFO 的时候,应当考虑在当前容器内的情况.

## 使用数组模拟栈

我们可以方便的使用数组来模拟一个栈,如下:

实现

C++Python

---|---

---|---

## C++ STL 中的栈

C++ 中的 STL 也提供了一个容器 `std::stack`,使用前需要引入 `stack` 头文件.

STL 中对 `stack` 的定义

---|---

T 为 stack 中要存储的数据类型.

Container 为用于存储元素的底层容器类型.这个容器必须提供通常语义的下列函数:

  • back()
  • push_back()
  • pop_back()

STL 容器 std::vectorstd::dequestd::list 满足这些要求.如果不指定,则默认使用 std::deque 作为底层容器.

STL 中的 stack 容器提供了一众成员函数以供调用,其中较为常用的有:

  • 元素访问
  • st.top() 返回栈顶
  • 修改
  • st.push() 插入传入的参数到栈顶
  • st.pop() 弹出栈顶
  • 容量
  • st.empty() 返回是否为空
  • st.size() 返回元素数量

此外,std::stack 还提供了一些运算符.较为常用的是使用赋值运算符 =stack 赋值,示例:

---|---

## 使用 Python 中的 list 模拟栈

在 Python 中,你可以使用列表来模拟一个栈:

实现

---|---

参考资料

  1. std::stack - zh.cppreference.com
本页面最近更新: 2026/1/7 08:56:54,更新历史 发现错误?想一起完善?在 GitHub 上编辑此页! 本页面贡献者:Ir1d, Xeonacid, i-yyi, william-song-shy, iamtwz, mgt, c-forrest, Enter-tainer, franklinqin0, ksyx, mcendu, Menci, nonPointer, renbaoshuo, shawlleyw, Shen-Linwood, Tiphereth-A 本页面的全部内容在CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用