【C++ STL】stack栈容器的基本使用

0 阅读2分钟

Stack容器

stack 是 C++ STL 中实现栈数据结构的容器适配器,遵循「后进先出(LIFO)」 原则,只能从栈顶插入 / 删除 / 访问元素,无法操作栈底或中间元素,也无法遍历。 特征:

  • 底层实现:默认基于 deque(双端队列)实现,也可指定 vectorlist 作为底层容器(需包含对应头文件)。
  • 核心特性
    • 仅支持栈顶(top)的访问 / 操作,无队首 / 队尾概念;
    • 无迭代器,无法遍历栈内元素;
    • 操作效率:入栈 / 出栈均为 O(1) 时间复杂度。

基本使用

  • 使用 stack 必须包含头文件<stack>,如果需要指定vector/list为底层容器,需额外包含<vector>或<list>头文件;
#include <stack>
// 如果需要指定vector/list为底层容器,需额外包含\<vector\>或\<list\>头文件;
#include <vector>
#include <list>
  • 定义与初始化
// 1、空栈,底层容器默认为deque
stack<int> s1;

// 2、指定底层容器
stack<int, list<int>> s2;

// 3、拷贝构造函数,需要保证底层容器一直
list<int> lst = { 0, 1, 2, 3, 4 };
stack<int, list<int>> s3(lst);

核心操作API

  • empty()判断栈是否为空,返回 bool(空为 true)
  • size()返回栈中元素个数(unsigned int 类型)
  • top()返回栈顶元素的引用(可修改,需非空)
  • push(val)栈顶插入元素 val
  • emplace(val)栈顶直接构造元素(效率高于 push)
  • pop()删除栈顶元素(无返回值,需非空)
  • swap(s)交换两个同类型栈的内容
list<int> lst = { 0, 1, 2, 3, 4 };
stack<int, list<int>> s3(lst);

// 栈顶压入元素
s3.push(10);

// 获取栈顶元素
cout << s3.top() << endl;

// 获取元素个数
cout << "size = " << s3.size() << endl;

使用注意

  • 空栈操作风险:调用 top()pop() 前必须用 empty() 判断栈非空,否则触发未定义行为(程序崩溃);
  • 无遍历能力stack 无迭代器,若需遍历需先复制栈并循环 pop(会破坏原栈);
  • 清空栈:STL 的 stack 未提供 clear() 函数,需通过 while(!s.empty()) s.pop() 实现;
  • 底层容器限制:指定底层容器时,需保证容器支持 back()push_back()pop_back()empty()size()deque/vector/list 均满足,但 vectorpop_back() 效率略低)

结束语

  • stack 是 LIFO 结构的容器适配器,仅支持栈顶操作,无随机访问和迭代器;
  • 核心操作:push()/emplace()(入栈)、pop()(出栈)、top()(访问栈顶)、empty()/size()(状态查询);
  • 空栈调用 top()/pop() 会导致程序崩溃,使用前务必检查非空,经典应用为括号匹配、DFS 等场景。