C++ std::stack
基础与用法
std::stack
是 C++ 标准模板库 (STL) 中的一个容器适配器,它提供了一种 后进先出 (Last-In, First-Out, LIFO) 的数据结构。 类似于现实生活中的一叠盘子,最后被放入栈中的元素将是第一个被移除的元素。
std::stack
核心知识
头文件:
#include <stack>
定义:
std::stack<int> myStack;
// 创建一个存储整数的栈std::stack<double> doubleStack;
// 创建一个存储双精度浮点数的栈std::stack<std::string> stringStack;
// 创建一个存储字符串的栈
主要特性:
- LIFO (Last-In, First-Out): 后进先出。
- 容器适配器: 基于其他容器 (默认是
std::deque
) 实现。 提供了受限的接口,以满足 LIFO 的要求。 - 动态大小: 栈的大小是动态的,取决于底层容器的实现。
常用成员函数:
push(const T& value)
: 将一个元素压入栈顶。T
: 栈存储的元素类型。value
: 要压入栈中的元素的值 (复制构造)。
emplace(Args&&... args)
(C++11 及以上): 在栈顶构造一个新元素 (避免复制或移动)。Args&&... args
: 用于构造新元素所需的参数。
pop()
: 从栈顶移除 (弹出) 一个元素。 不返回被移除的元素的值.top()
: 访问栈顶元素 (返回栈顶元素的 引用)。 不移除元素.empty()
: 检查栈是否为空。- 返回
true
如果栈为空,否则返回false
。
- 返回
size()
: 返回栈中元素的数量。
示例代码:
c++#include <iostream> #include <stack> #include <string> int main() { std::stack<int> myStack; // 压入元素 myStack.push(10); myStack.push(20); myStack.push(30); std::cout << "Stack size: " << myStack.size() << std::endl; // 输出:Stack size: 3 // 访问栈顶元素 std::cout << "Top element: " << myStack.top() << std::endl; // 输出:Top element: 30 // 弹出元素 while (!myStack.empty()) { std::cout << "Popping: " << myStack.top() << std::endl; myStack.pop(); } std::cout << "Stack size after popping: " << myStack.size() << std::endl; // 输出:Stack size after popping: 0 // 使用 emplace (C++11+) std::stack<std::string> stringStack; stringStack.emplace("hello"); stringStack.emplace("world"); std::cout << "Top string: " << stringStack.top() << std::endl; // 输出:Top string: world return 0; }
底层实现:
- 默认使用
std::deque
作为底层容器. - 也可使用
std::vector
或std::list
,但deque
通常是最佳选择.
- 默认使用
使用注意事项:
- 在使用
top()
之前,必须先调用empty()
检查栈是否为空. pop()
仅移除元素,不返回元素的值. 使用top()
获取后再使用pop()
.- 没有迭代器: 无法使用迭代器遍历
std::stack
. - 容器适配器: 提供受限接口,满足 LIFO.
- 在使用
应用场景:
- 表达式求值 (后缀表达式)。
- 函数调用栈。
- 括号匹配。
- 深度优先搜索 (DFS)。
- 撤销/重做功能。
- 回溯算法。
- 浏览器历史记录。