
第三课《排队王国------认识队列 Queue》
🌟一、故事开场:奶茶王国的大排队
1、在遥远的数据结构王国里,
有一家超级有名的奶茶店:
🧋《珍珠龙奶茶店》
每天都有无数顾客来排队。
这一天,
小勇士阿 C 也来了。
2、🌟第1位顾客
小红先来到队伍:
小红
3、🌟第2位顾客
小明来了:
小红 ← 前面
小明 ← 后面
4、🌟第3位顾客
小刚来了:
小红
小明
小刚
5、🤔问题来了!
现在奶茶做好了。
请问:
谁会最先拿到奶茶?
6、很多同学立刻回答:
✅ 小红!
因为:
🌟先来的人先服务!
7、🌟这就是今天的主角:
🎯队列(Queue)
🌟二、什么是队列?
1、队列是一种特殊的数据结构。
(1)它最重要的规则是:
⚡先进先出
(2)英文叫:
FIFO
(3)全称:
First In First Out
先进先出
2、🌟和栈有什么区别?
(1)🌟栈 Stack
像:
叠盘子
最后放的先拿。
👉 后进先出
(2)🌟队列 Queue
像:
排队买奶茶
先来的先走。
👉 先进先出
🌟三、生活中的队列
其实生活里到处都是队列!
🚌例子1:公交车排队
谁先到站台:
谁先上车。
🎢例子2:游乐园排队
先排队的人:
先玩过山车。
🖨️例子3:打印机
先发送的文件:
先打印。
🍔例子4:食堂打饭
谁先排队:
谁先打饭。
🌟四、队列长什么样?
1、队列有两个重要位置:
(1)🎯队头(front/head)
从这里离开。
(2)🎯队尾(rear/tail)
从这里进入。
2、🌟图示
队头 队尾
↓ ↓
[ 小红 ][ 小明 ][ 小刚 ]
🌟五、队列的四种基本操作
1、⚔️第一招:push(入队)
意思:
👉 从队尾进入。
2、🌟演示
(1)开始:
空队列
(2)小红进入:
小红
(3)小明进入:
小红 小明
(4)小刚进入:
小红 小明 小刚
3、⚔️第二招:pop(出队)
意思:
👉 队头离开。
4、🌟演示
(1)现在:
小红 小明 小刚
(2)执行:
pop();
小红离开!
(3)变成:
小明 小刚
5、⚔️第三招:front(查看队头)
意思:
👉 看看最前面是谁。
但不让他离开。
6、🌟演示
(1)现在:
小明 小刚
(2)执行:
front();
(3)得到:
小明
队列不变。
7、⚔️第四招:empty(是否为空)
意思:
👉 队列里还有没有人。
🌟六、要理解"先进先出"
1、🎮小游戏:《排队坐过山车》
规定:
后来的人只能排后面
前面的人先玩
2、🌟顺序
A来了
B来了
C来了
队列:
A B C
3、🌟开始玩
第一个玩的是:
✅ A
然后:
B C
第二个:
✅ B
最后:
✅ C
4、🌟规律发现:
🌟最先进来的
最先出去
这就是:
FIFO!
🌟七、用数组实现队列
1、🌟队列像什么?
可以把数组想成:
一排座位
比如:
int q[100];
2、🌟我们需要两个指针
(1)🎯head
表示:
队头位置。
(2)🎯tail
表示:
队尾后一个位置。
(3)🌟代码
int head = 0;
int tail = 0;
🌟八、push 的实现(入队)
1、🌟目标
从队尾加入元素。
2、🌟代码
q[tail] = x;
tail++;
3、🌟过程理解
(1)开始:
head = 0
tail = 0
(2)执行:
push(5)
(3)第一步
q[0] = 5;
(4)第二步
tail++;
(5)变成:
tail = 1
4、🌟队列现在
5
5、🌟再执行 push(8)
变成:
5 8
🌟九、pop 的实现(出队)
1、🌟代码
head++;
2、🤔为什么不用删除?
因为:
我们只需要:
👉 让队头往后移动。
3、🌟过程
(1)现在:
5 8 3
↑
head
(2)执行:
pop();
(3)变成:
5 8 3
↑
head
5 就相当于离开了。
🌟十、完整代码(数组队列)
#include <iostream>
using namespace std;
int q[100];
int head = 0;
int tail = 0;
int main() {
// 入队
q[tail] = 5;
tail++;
q[tail] = 8;
tail++;
q[tail] = 3;
tail++;
// 输出队头
cout << "队头元素:";
cout << q[head] << endl;
// 出队
head++;
cout << "出队后队头:";
cout << q[head] << endl;
return 0;
}
🌟十一、运行过程
1、🌟开始
空
head = 0
tail = 0
2、🌟push(5)
5
head = 0
tail = 1
3、🌟push(8)
5 8
head = 0
tail = 2
4、🌟push(3)
5 8 3
head = 0
tail = 3
5、🌟pop()
5 8 3
↑
head = 1
tail = 3
队头变成 8。
🌟十二、栈 VS 队列(第一次对比)
这是很多同学刚开始容易搞混的地方!
1、🌟栈 Stack
后进先出
像:
叠盘子
薯片桶
2、🌟队列 Queue
先进先出
像:
排队
食堂打饭
3、🌟操作对比
(1)🌟栈
只能操作顶部
(2)🌟队列
一头进
一头出
🌟十三、课堂小游戏:《奶茶店老板》
1、汉克老师扮演奶茶店营业员。
学生排队。
2、规则:
新人只能站最后
只能从最前面叫号
3、帮助同学们真正建立:
🌟"队伍流动"的感觉!
🌟十四、举一反三训练
🤔问题1
为什么打印机适合用队列?
🤔问题2
为什么食堂打饭适合用队列?
🤔问题3
依次入队:
1 2 3 4
请写出:
出队顺序。
🤔问题4
如果:
队列:
7 2 9
执行一次 pop 后:
新的队头是谁?
🌟十五、为什么队列很重要?
以后你会发现:
很多厉害算法都在用队列!
比如:
1、🌟广度优先搜索 BFS
迷宫最短路!
2、🌟图论
找最短距离!
3、🌟任务调度
电脑系统安排任务!
4、🌟消息处理
聊天软件收消息!
🌟十六、课堂总结
🎯今天学会了什么?
1、🌟队列特点
✅ 先进先出
✅ 一头进,一头出
2、🎯四大操作
| 操作 | 作用 |
|---|---|
| push | 入队 |
| pop | 出队 |
| front | 查看队头 |
| empty | 判空 |
3、🎯生活中的队列
✅ 排队买奶茶
✅ 公交车排队
✅ 打印机
✅ 食堂打饭
🌟十七、本课小秘诀
今天最重要的,
不是代码。
而是:
🌟"排队流动"的画面感!
你脑子里要真正出现:
人从后面进入
人从前面离开
以后学:
BFS
图论
最短路
模拟题
都会轻松很多!
因为:
今天这一课,
其实是很多高级算法的起点!