1. 底层实现
std::stack
是C++标准库中的一个适配器容器,适用于后进先出(LIFO,Last In First Out)操作。std::stack
本身不拥有数据存储,而是利用其他容器(通常是 std::deque
或 std::vector
)作为其底层,来存储和管理元素:
- 底层容器:默认情况下,
std::stack
使用std::deque
作为其底层容器。 - 特性和操作:
push
:在栈顶插入元素。pop
:移除栈顶元素。top
:访问栈顶元素。empty
:检测栈是否为空。size
:返回栈中元素个数。
2. 缺点和比较
由于std::stack
仅是一个适配器,它的优点和缺点取决于所使用的底层容器:
- 缺点:
- 不支持随机访问,只能访问栈顶元素。
stack
是序列适配器,不提供遍历功能,只能通过一系列特定接口访问数据。
- 相同结构的容器对比:
std::deque
:- 优点:支持双端插入和删除操作,随机访问效率相对较好。
- 缺点:使用
deque
作为栈底层时,若不需要双端操作功能,则会带来额外的空间开销。
std::vector
:- 优点:连续内存,随机访问效率高。适合不频繁插入删除的操作。
- 缺点:插入删除开销大,使用
vector
作为栈底层时,在栈溢出和重新分配内存时效率不如deque
。
3. 优点和使用场景
-
优点:
- 易于理解和使用,提供了简洁的接口支持LIFO操作。
- 使用标准库的底层容器,提高操作的可靠性和效率。
-
使用场景:
- 实现递归和回溯算法。
- 表达式求值(如逆波兰表示法)。
- 深度优先搜索(DFS)算法的实现。
- 括号匹配和其它需要LIFO数据结构的场景。
4. 补充和代码示例
以下是关于 std::stack
的一些常见操作示例:
#include <iostream>
#include <stack>
int main() {
// 创建一个空的 stack
std::stack<int> st;
// 向 stack 中添加元素
st.push(1);
st.push(2);
st.push(3);
// 访问并打印 stack 顶部元素
std::cout << "Top element: " << st.top() << std::endl;
// 移除 stack 顶部元素
st.pop();
std::cout << "Top element after pop: " << st.top() << std::endl;
// 检查 stack 是否为空
std::cout << "Is stack empty? " << (st.empty() ? "Yes" : "No") << std::endl;
// 打印 stack 的大小
std::cout << "Stack size: " << st.size() << std::endl;
return 0;
}
总结
- 底层:
std::stack
是一个适配器容器,默认使用std::deque
作为底层。 - 缺点:
- 不支持随机访问。
- 只提供特定接口访问数据,无法遍历。
- 优点:
- 简洁易用,支持LIFO操作。
- 采用标准库的容器做底层,优化了性能和可靠性。
- 使用场景:
- 适用于递归和回溯算法。
- 表达式求值。
- 深度优先搜索(DFS)。
- 括号匹配等需要LIFO的场景。