C++中stack和queue是STL提供的容器适配器,分别用于实现后进先出(LIFO)和先进先出(FIFO)操作。stack支持push、pop、top等操作,常用于括号匹配等场景;queue提供front、back、push、pop等功能,适用于层序遍历(BFS)等应用。两者均需包含对应头文件并注意访问前判空,避免运行时错误。

在C++中,stack(栈)和queue(队列)是两种常用的数据结构,它们被包含在标准模板库(STL)中,分别定义于#include 和#include 头文件。虽然底层可以用vector、deque或list实现,但它们提供了一种更安全、更语义化的接口来处理“后进先出”和“先进先出”的逻辑。
stack 栈的基本使用
栈是一种后进先出(LIFO, Last In First Out)的数据结构。C++中的std::stack是一个容器适配器,它不支持遍历,只允许从一端(栈顶)进行操作。
常用操作包括:
- push(element):将元素压入栈顶
- pop():移除栈顶元素(不返回值)
- top():获取栈顶元素的引用
- empty():判断栈是否为空
- size():返回栈中元素个数
示例代码:
立即学习“C++免费学习笔记(深入)”;
#include
#includeint main() { std::stack s; s.push(10); s.push(20); s.push(30); while (!s.empty()) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn " "; s.pop(); } // 输出:30 20 10 return 0;}
queue 队列的基本使用
队列遵循先进先出(FIFO, First In First Out)原则。C++中的std::queue也是容器适配器,默认基于deque实现。
主要操作有:
- push(element):在队尾添加元素
- pop():删除队首元素(不返回值)
- front():访问队首元素
- back():访问队尾元素
- empty() 和 size():与stack一致
示例代码:
立即学习“C++免费学习笔记(深入)”;
#include
#includeint main() { std::queue q; q.push(10); q.push(20); q.push(30); while (!q.empty()) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn q.front() zuojiankuohaophpcnzuojiankuohaophpcn " "; q.pop(); } // 输出:10 20 30 return 0;}
实战应用场景举例
stack和queue在算法题和系统设计中非常实用。
使用 stack 判断括号匹配
遍历字符串,遇到左括号入栈,右括号时检查栈顶是否匹配并弹出。
bool isValid(std::string s) {
std::stack st;
for (char c : s) {
if (c == '(' || c == '[' || c == '{') {
st.push(c);
} else {
if (st.empty()) return false;
if ((c == ')' && st.top() != '(') ||
(c == ']' && st.top() != '[') ||
(c == '}' && st.top() != '{')) {
return false;
}
st.pop();
}
}
return st.empty();
}
使用 queue 实现层序遍历(BFS)
二叉树的广度优先搜索依赖队列保存待访问节点。
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
void bfs(TreeNode root) {
if (!root) return;
std::queue> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front(); q.pop();
std::cout zuojiankuohaophpcnzuojiankuohaophpcn node-youjiankuohaophpcnval zuojiankuohaophpcnzuojiankuohaophpcn " ";
if (node-youjiankuohaophpcnleft) q.push(node-youjiankuohaophpcnleft);
if (node-youjiankuohaophpcnright) q.push(node-youjiankuohaophpcnright);
}}
基本上就这些。掌握stack和queue的接口和典型用法,能显著提升编码效率,特别是在处理递归模拟、状态暂存、广度搜索等场景时。注意不要误用top()或front()前未判空,否则会引发运行时错误。










