Stack容器
stack 是 C++ STL 中实现栈数据结构的容器适配器,遵循「后进先出(LIFO)」 原则,只能从栈顶插入 / 删除 / 访问元素,无法操作栈底或中间元素,也无法遍历。 特征:
- 底层实现:默认基于
deque(双端队列)实现,也可指定vector或list作为底层容器(需包含对应头文件)。 - 核心特性:
- 仅支持栈顶(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)栈顶插入元素 valemplace(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均满足,但vector的pop_back()效率略低)
结束语
stack是 LIFO 结构的容器适配器,仅支持栈顶操作,无随机访问和迭代器;- 核心操作:
push()/emplace()(入栈)、pop()(出栈)、top()(访问栈顶)、empty()/size()(状态查询); - 空栈调用
top()/pop()会导致程序崩溃,使用前务必检查非空,经典应用为括号匹配、DFS 等场景。