✅队列 Queue 复习笔记
2026-10-18 15:53:05
发布于:广东
一、大树包子铺开业啦!
1. 场景引入:
想象一下,有一家生意火爆的‘大树包子铺’。因为包子太香了,门口排起了长队。
大家想一想,现实生活中排队买包子要遵守什么规则?
是不是先来的人先买到、先离开?如果你刚来就想插队,后面的人肯定不答应。
在计算机里,有一种数据结构就是模仿这种‘先来后到’的规则,它叫——队列 Queue。
队列的核心特点就是四个字:先进先出 FIFO。
队列 Queue:先进先出 FIFO
入队 push → 队尾
出队 pop → 队头
2. 概念对应
| 生活场景 | 队列术语 | 代码含义 |
|---|---|---|
| 走到队伍最后排队 | 入队 | push(x) |
| 第一个人买完离开 | 出队 | pop() |
| 老板看排在最前面的人 | 查看队头 | front() |
| 大妈看排在最后的人 | 查看队尾 | back() |
| 队伍没人了 | 判空 | empty() |
| 数一数有几个人 | 求长度 | size() |
3. 六个函数讲解
**push(x)**:加入队伍
“小明来了,他不能插队,只能站到队伍最后面。这个过程就是 push(x)。”
queue<int> q;
q.push(10); // 10号顾客加入队尾
**pop()**:买完离开
“排在第一位的人买完包子走了。注意,pop() 只负责让他离开,不负责把值给你看。”
q.pop(); // 队头元素离开,不返回值
**front()**:看队头
“老板抬头看一眼:现在排在最前面的是谁?只看一眼,不让人走。”
cout << q.front(); // 返回队头元素
**back()**:看队尾
“大妈往后看:谁是最后一个排队的?”
cout << q.back(); // 返回队尾元素
**empty()**:队伍空了吗?
“天快黑了,老板看外面没人了,就准备关门。”
if (q.empty()) cout << "没人了";
**size()**:还有几个人?
“老板娘问:外面还有几个人?老张数了一下,还有 5 个。”
cout << q.size(); // 返回队列元素个数
4. 完整示例
#include <bits/stdc++.h>
using namespace std;
int main(){
queue<int> q;
q.push(10); // 10号顾客排队
q.push(20); // 20号顾客排队
q.push(30); // 30号顾客排队
cout << "队头:" << q.front() << endl; // 10
cout << "队尾:" << q.back() << endl; // 30
cout << "人数:" << q.size() << endl; // 3
q.pop(); // 10号顾客买完离开
cout << "现在队头:" << q.front() << endl; // 20
cout << "现在人数:" << q.size() << endl; // 2
// 安全遍历队列
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}
cout << endl;
return 0;
}
输出:
队头:10
队尾:30
人数:3
现在队头:20
现在人数:2
20 30
5. 避坑提醒
**pop()**** 不返回值**,要取值必须先用front()。- 调用
front()、back()、pop()前,最好先用empty()判断队列是否为空。 - 队列不能像数组那样用下标访问,只能从队头取、队尾入。
- 遍历队列时,
pop()会让元素消失,所以遍历结束后队列会变空。
二、优先队列 priority_queue
1. 场景引入:VIP 插队机制
刚才普通队列排队买包子,讲究公平,先来后到。
但现在大树包子铺推出了 VIP 服务:不再看谁先来,而是看谁的‘身份牌’更大。
谁的数字最大,谁就有插队权,永远第一个买包子。
这种能自动排序、按优先级出队的队列,就是 优先队列 priority_queue。
priority_queue:优先队列
默认:数值越大,优先级越高
底层:堆
2. 默认规则:大数优先
priority_queue<int> q;
“如果什么都不写,默认规则就是:数字越大,越先出队。”
q.push(1);
q.push(5);
q.push(3);
cout << q.top() << endl; // 5
注意:优先队列用 top() 查看最高优先级元素,不用 front()
3. 完整写法
priority_queue<int, vector<int>, less<int>> q;
三个参数含义:
| 参数 | 含义 |
|---|---|
int |
队列里存什么类型 |
vector<int> |
底层容器 |
less<int> |
排序规则 |
重点提醒:
“less<int> 看起来像‘小’,但在优先队列里,它表示大数优先。
可以这样记:less 默认让大的先出来,greater 让小的先出来。”
4. 小数优先写法
priority_queue<int, vector<int>, greater<int>> q;
“这种写法就是小数优先。比如急诊室排号,数字越小越紧急,越先处理。”
q.push(10);
q.push(3);
q.push(7);
cout << q.top() << endl; // 3
5. 常用函数
| 函数 | 作用 |
|---|---|
push(x) |
入队 |
pop() |
弹出最高优先级元素 |
top() |
查看最高优先级元素 |
empty() |
判断是否为空 |
size() |
返回元素个数 |
注意:优先队列没有 front() 和 back(),只有 top()。
6. 完整示例
#include <bits/stdc++.h>
using namespace std;
int main(){
// 大数优先
priority_queue<int> q1;
q1.push(1);
q1.push(5);
q1.push(3);
cout << "大数优先:";
while (!q1.empty()) {
cout << q1.top() << " ";
q1.pop();
}
cout << endl; // 5 3 1
// 小数优先
priority_queue<int, vector<int>, greater<int>> q2;
q2.push(1);
q2.push(5);
q2.push(3);
cout << "小数优先:";
while (!q2.empty()) {
cout << q2.top() << " ";
q2.pop();
}
cout << endl; // 1 3 5
return 0;
}
7. 顺口溜记忆
“优先队列玩 VIP,三个括号不能移。
底层箱子 vector,排序规则在最后。
less 表示大数先,greater 是小数前。”
8. 避坑提醒
- 优先队列默认是大数优先。
- 取元素用
top(),不是front()。 - 三个模板参数必须写全:
priority_queue<int, vector<int>, greater<int>>。 - 同样要在
top()、pop()前判断empty()。 - 优先队列底层是堆,适合求最大值、最小值、Top-K 等问题。
全部评论 4
- 置顶
包子卖不完怎么办?倒掉。
规矩要立住,路才能越走越宽。
他们抢的走生意,抢不走人心。
贵是贵点,但吃了不烧心。
生意越来越好了!嗯,要稳。2天前 来自 上海
2 我是赵怀锦丑树老师最丑
















































































































































2天前 来自 广东
12天前 来自 广东
0欠揍
昨天 来自 广东
0
6
2天前 来自 甘肃
0呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐呕吐嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄嘲弄恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心恶心
2天前 来自 广东
0
我是曾语琛
2天前 来自 广东
0
































有帮助,赞一个