一、stack容器概述
stack
容器适配器是C++标准模板库(STL)中实现后进先出(LIFO)数据结构的重要组件,它通过封装底层容器(如deque
/vector
/list
)提供栈操作接口。
二、stack核心操作详解
1. 容器构造方式
// 默认使用deque存储元素
stack<int> staInt; // 显式指定底层容器
stack<int, vector<int>> vecStack;
stack<int, list<int>> listStack;
stack<int, deque<int>> dequeStack;
deque
:默认底层容器,支持快速首尾操作vector
:需要包含头文件<vector>
list
:需要包含头文件<list>
2. 元素操作函数
staInt.push(1); // 压栈操作
staInt.push(2);
staInt.pop(); // 弹出栈顶元素(需保证栈非空)
staInt.push(3);
3. 栈顶访问与修改
int& iTop = staInt.top(); // 获取栈顶的引用
iTop = 66; // 通过引用直接修改栈顶值
staInt.top() = 88; // 直接修改栈顶元素
4. 容器状态查询
cout << "栈大小: " << staInt.size() << endl;
cout << "是否为空: " << boolalpha << staInt.empty() << endl;
5. 栈遍历与清空
while (!staInt.empty()) {cout << staInt.top() << " ";staInt.pop(); // 必须弹出才能访问下层元素
}
三、关键特性解析
-
底层容器选择:
vector
:动态数组实现,push
/pop
需要O(1)摊销时间list
:链表实现,所有操作保证O(1)时间复杂度deque
(默认):分块数组实现,综合性能最优
-
元素访问特性:
top()
返回引用,可直接修改栈顶元素- 修改栈顶元素不会改变栈的结构特性
-
安全操作规范:
- 调用
pop()
前必须确保栈非空 - 使用
empty()
判断替代size() == 0
更高效
- 调用
四、典型应用场景
- 函数调用栈模拟
- 括号匹配验证
- 表达式求值(逆波兰式)
- 撤销操作实现
五、完整代码回顾
#include <iostream>
#include <vector>
#include <stack>
#include <list>
#include <deque>using namespace std;int main(void) {// stack对象的默认构造// stack<int> staInt; // 默认使用deque存储元素// stack<int, vector<int>> staInt;// stack<int, list<int>> staInt;stack<int, deque<int>> staInt;// stack的push()与pop()方法staInt.push(1);staInt.push(2);// staInt.pop();staInt.push(3);// int iTop = staInt.top();int& iTop = staInt.top();iTop = 66;cout << "staInt.top: " << staInt.top() << endl;staInt.top() = 88;cout << "staInt.size: " << staInt.size() << endl;cout << "staInt.top: " << staInt.top() << endl;while (!staInt.empty()) {cout << staInt.top() << " ";staInt.pop(); // 栈顶的元素出栈}cout << endl;system("pause");return 0;
}
六、代码执行流程
- 使用
deque
作为底层容器构造栈 - 依次压入1、2、3(注释掉了pop操作)
- 演示通过引用修改栈顶元素
- 输出修改后的栈顶值
- 遍历并清空栈
输出结果:
staInt.top: 66
staInt.size: 3
staInt.top: 88
88 2 1
七、注意事项
- 空栈操作防护:执行
top()
或pop()
前必须检查empty()
- 元素生命周期:存储对象时注意引用有效性
- 容器选择原则:根据操作频率选择最优底层容器
- 异常安全:修改栈顶元素时需考虑可能引发的异常