std::stack
是 C++ 标准库中的一种容器适配器,它提供了栈(LIFO,后进先出)数据结构的实现。std::stack
本质上是一个容器适配器,它可以基于其他容器(如 std::deque
、std::vector
或 std::list
)来实现栈的功能。
1. 底层实现
std::stack
并不是一个独立的数据结构,而是对其他序列容器(默认情况下为 std::deque
)进行封装,提供了栈的接口。你可以选择使用不同的底层容器来实现 std::stack
,但是它的操作受限于栈的性质,即只允许在一端进行插入和删除操作。
默认实现
- 默认容器:
std::deque
是std::stack
的默认底层容器。std::deque
(双端队列)允许在两端进行高效的插入和删除操作,这与栈的需求非常匹配。
自定义实现
- 你可以使用
std::vector
或std::list
作为底层容器,只需要在定义std::stack
时指定:std::stack<int, std::vector<int>> stackWithVector;
2. 常用成员函数
std::stack
提供了几种常用的操作函数,这些函数都是栈操作的经典实现:
构造函数
stack()
:创建一个空栈。stack(const Container& cont)
:使用指定的容器cont
初始化栈。
元素访问
top()
:返回栈顶元素的引用。这个操作不会移除元素,仅仅返回栈顶元素。
容量
empty()
:检查栈是否为空。如果栈为空,返回true
;否则返回false
。size()
:返回栈中元素的个数。
修改
push(const T& value)
:将元素value
压入栈顶。pop()
:移除栈顶元素,但不会返回该元素。emplace(Args&&... args)
:在栈顶位置直接构造元素。它比push
更高效,因为可以避免临时对象的创建。
3. 具体操作示例
以下是一个使用 std::stack
的简单示例:
#include <iostream>
#include <stack>
#include <vector>
int main() {
// 使用默认的 deque 作为底层容器
std::stack<int> stack;
// 将元素压入栈顶
stack.push(10);
stack.push(20);
stack.push(30);
std::cout << "Stack size: " << stack.size() << std::endl;
std::cout << "Top element: " << stack.top() << std::endl;
// 弹出栈顶元素
stack.pop();
std::cout << "Top element after pop: " << stack.top() << std::endl;
// 判断栈是否为空
while (!stack.empty()) {
std::cout << "Popping element: " << stack.top() << std::endl;
stack.pop();
}
// 使用 vector 作为底层容器
std::stack<int, std::vector<int>> stackWithVector;
stackWithVector.push(40);
stackWithVector.push(50);
std::cout << "Top element in stackWithVector: " << stackWithVector.top() << std::endl;
return 0;
}
4. 总结
- 底层实现:
std::stack
是一个容器适配器,默认使用std::deque
作为底层容器。你可以根据需要选择不同的底层容器,如std::vector
或std::list
。 - 主要操作:
std::stack
提供了push
、pop
、top
、empty
和size
等操作,用于管理栈顶元素和检查栈的状态。 - 适用场景:
std::stack
适用于需要 LIFO 行为的数据结构,如表达式求值、递归模拟等