在C++标准库中,queue和stack都属于容器适配器,它们基于底层容器封装了特定的数据结构操作逻辑,分别对应先进先出的队列和先进后出的栈,是日常开发中处理顺序存储问题的常用工具。

queue的基本用法
queue即队列,核心特性是先进先出,只能从队尾插入元素,从队头取出元素,不支持随机访问。它的底层默认基于deque容器实现,也可以指定其他支持push_back和pop_front的底层容器。
queue的常用成员函数
- push():在队尾插入元素
- pop():移除队头元素
- front():返回队头元素的引用
- back():返回队尾元素的引用
- empty():判断队列是否为空,为空返回true
- size():返回队列中元素的个数
queue使用示例
#include <iostream>
#include <queue>
using namespace std;
int main() {
// 定义存储int类型的队列
queue<int> q;
// 向队尾插入元素
q.push(10);
q.push(20);
q.push(30);
// 输出队头、队尾元素
cout << "队头元素:" << q.front() << endl; // 输出10
cout << "队尾元素:" << q.back() << endl; // 输出30
// 遍历队列并取出所有元素
while (!q.empty()) {
cout << q.front() << " "; // 依次输出10 20 30
q.pop(); // 移除队头元素
}
cout << endl;
cout << "队列当前大小:" << q.size() << endl; // 输出0
return 0;
}
stack的基本用法
stack即栈,核心特性是先进后出,只能从栈顶插入和取出元素,同样不支持随机访问。它的底层默认基于deque实现,也可以指定支持push_back和pop_back的底层容器。
stack的常用成员函数
- push():将元素压入栈顶
- pop():移除栈顶元素
- top():返回栈顶元素的引用
- empty():判断栈是否为空,为空返回true
- size():返回栈中元素的个数
stack使用示例
#include <iostream>
#include <stack>
using namespace std;
int main() {
// 定义存储int类型的栈
stack<int> s;
// 向栈顶压入元素
s.push(10);
s.push(20);
s.push(30);
// 输出栈顶元素
cout << "栈顶元素:" << s.top() << endl; // 输出30
// 遍历栈并取出所有元素
while (!s.empty()) {
cout << s.top() << " "; // 依次输出30 20 10
s.pop(); // 移除栈顶元素
}
cout << endl;
cout << "栈当前大小:" << s.size() << endl; // 输出0
return 0;
}
queue和stack的差异对比
两者都是容器适配器,核心差异在于存取元素的顺序逻辑,具体对比如下:
| 对比项 | queue(队列) | stack(栈) |
|---|---|---|
| 存取顺序 | 先进先出,队尾进队头出 | 先进后出,栈顶进栈顶出 |
| 核心访问接口 | front()取队头,back()取队尾 | top()取栈顶 |
| 典型应用场景 | 消息队列、广度优先搜索、缓冲区处理 | 函数调用栈、表达式求值、深度优先搜索 |
使用注意事项
- 调用
front()、back()、top()前必须先判断容器不为空,否则会导致未定义行为 pop()函数只负责移除元素,不会返回被移除的元素,如果需要获取元素需要先调用访问接口再调用pop()- 两者都不支持迭代器,无法直接遍历内部元素,只能通过循环取出元素的方式遍历