C++ std::stack 完全指南:核心操作、实战示例与 STL 应用
什么是 std::stack?
std::stack 是实现 LIFO(后进先出)原则的容器适配器。仅允许从一端——栈顶——插入和移除元素。默认以 std::deque 作为底层容器,但也可提供任何序列容器(如 std::vector 或 std::list)。
容器适配器不暴露迭代器,无法直接遍历栈。只能通过成员函数交互。
学习目标
- 理解 std::stack 定义与 LIFO 行为
- 掌握声明语法
- 探索成员类型与核心操作
- 实战 push、pop、top、empty、size、emplace、swap
- 在 STL 中实现栈
语法
包含 <stack> 头文件,按以下模板声明栈:
template<class T, class Container = std::deque<T>> class stack;
- T – 元素类型;任意合法 C++ 类型,含用户自定义类。
- Container – 底层容器;默认
std::deque。
成员类型
value_type– 元素类型T。container_type– 底层容器类型。size_type– 容器大小的无符号整型。
核心操作
push()– 将元素压入栈顶。pop()– 移除栈顶元素。top()– 访问栈顶元素但不移除。empty()– 判断栈是否为空。size()– 返回元素数量。emplace()– 在栈顶原地构造并插入元素。swap()– 与另一个栈高效交换内容。
实现概览
下图展示栈操作示意(箭头指向栈顶)。
push() 与 pop()
push() 追加新元素,大小加一:
stack.push(value);
pop() 移除栈顶元素,大小减一:
stack.pop();
示例 1:基础栈操作
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st; st.push(10); st.push(20); st.push(30); st.push(40); st.pop(); // 移除 40 st.pop(); // 移除 30 while (!st.empty()) { cout << ' ' << st.top(); st.pop(); } return 0; }
输出:20 10
empty()、size()、top()
这些工具函数快速洞察栈状态。
示例 2:检查栈状态
#include <iostream> #include <stack> using namespace std; void display(stack<int> s) { while (!s.empty()) { cout << '\t' << s.top(); s.pop(); } cout << '\n'; } int main() { stack<int> st; st.push(32); st.push(21); st.push(39); st.push(89); st.push(25); cout << "The stack st is: "; display(st); cout << "\n st.size() : " << st.size(); cout << "\n st.top() : " << st.top(); st.pop(); cout << "\n st after pop: "; display(st); return 0; }
输出:展示栈内容、大小、栈顶元素、pop 后状态。
emplace() 与 swap()
• emplace() 原地构造元素,避免额外拷贝。
• swap() 高效交换两个栈的内容。
示例 3:使用 emplace() 与 swap()
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st1, st2; st1.emplace(12); st1.emplace(19); st2.emplace(20); st2.emplace(23); st1.swap(st2); cout << "st1 = "; while (!st1.empty()) { cout << st1.top() << " "; st1.pop(); } cout << endl << "st2 = "; while (!st2.empty()) { cout << st2.top() << " "; st2.pop(); } }
输出:演示交换前后两栈内容。
在 STL 中使用 std::stack
一行代码实现栈:
std::stack<T> st;
示例:
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st; st.push(12); st.push(19); st.push(20); cout << st.top(); // 20 cout << st.size(); // 3 return 0; }
总结
- std::stack 实现 LIFO,仅允许访问栈顶元素。
- 它是容器适配器;默认底层容器为
std::deque,可自定义。 - 核心函数:
push、pop、top、empty、size、emplace、swap。 - 栈是需临时存储元素场景下的轻量高效工具。
C语言
- C++ 运算符全解析:类型、示例与示例程序
- C++ do-while 循环详解:语法、实战示例与嵌套循环
- 掌握 C++ switch-case:语法、用法与实战示例
- C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理
- C++ 指针精通:核心概念、代码示例与实战应用
- C++ 运算符重载实战指南:语法、方法、限制与代码示例
- C++ 结构体详解:定义、初始化、指针、函数参数与局限性
- C++ std::map 完全指南:键值对容器、核心操作与实战代码
- 掌握 C++ std::list:语法、函数与实战示例
- C++ 函数详解:从声明到调用的实战指南
- C++ Struct 与 Class 核心差异、语法及最佳实践
- Python collections.Counter:高效计数、更新与算术运算