队列是一种非常基础且常用的数据结构,它的核心特点是“先进先出”(FIFO,First In First Out)。想象一下,我们在超市排队结账,第一个人会最先结账离开,第二个人随后,这就是队列的典型场景——先来的排在前面,先处理。
一、队列的基本概念¶
- 队列(Queue):一种遵循“先进先出”原则的数据结构,只能在一端添加元素(队尾),在另一端取出元素(队头)。
- 队头(Front):队列的第一个元素,是最早进入队列的元素。
- 队尾(Rear):队列的最后一个元素,是最晚进入队列的元素。
- 基本操作:
- 入队(Enqueue):将新元素添加到队尾。
- 出队(Dequeue):从队头取出并移除元素。
二、队列如何实现?(以数组为例)¶
为了简单理解队列的实现,我们可以用一个固定大小的数组来模拟队列。需要两个关键变量:
- front:指向队头(第一个元素),初始值为 0。
- rear:指向队尾(最后一个元素),初始值为 0。
- 数组 arr:用于存储队列元素,容量设为 max_size(例如 5)。
核心规则:¶
- 队空条件:
front == rear(此时队列为空,没有元素)。 - 队满条件:
rear == max_size(此时队列已满,无法再入队)。 - 入队逻辑:将元素放入
arr[rear],然后rear++。 - 出队逻辑:取出
arr[front],然后front++。
三、实例演示:模拟队列的“入队”与“出队”¶
假设队列容量为 5,初始时 front=0,rear=0,数组为空。
步骤 1:入队 1、2、3¶
- 入队 1:
arr[0] = 1,rear=1→ 队列:[1] - 入队 2:
arr[1] = 2,rear=2→ 队列:[1, 2] - 入队 3:
arr[2] = 3,rear=3→ 队列:[1, 2, 3]
步骤 2:出队 1,再入队 4¶
- 出队 1:取出
arr[front=0],front=1→ 队列:[2, 3] - 入队 4:
arr[3] = 4,rear=4→ 队列:[2, 3, 4]
步骤 3:入队 5,再出队 2¶
- 入队 5:
arr[4] = 5,rear=5→ 队列:[2, 3, 4, 5](此时队列已满,无法再入队) - 出队 2:取出
arr[front=1],front=2→ 队列:[3, 4, 5]
此时队列中剩余元素为 3, 4, 5,front=2,rear=5,队列未满且非空。
四、队列的应用场景¶
队列在编程和实际场景中非常常用,例如:
- 任务调度:操作系统中的“任务队列”(如 CPU 处理任务时,新任务排队等待)。
- 广度优先搜索(BFS):在树或图的遍历中,按层遍历节点(类似“逐层处理”)。
- 打印机队列:打印文档时,先提交的文档先打印。
- 网络请求:网页加载时,同时请求的资源会按顺序在队列中处理。
总结¶
队列的核心是“先进先出”,通过数组或链表等结构可以轻松实现。理解队列的关键是记住:入队从队尾加,出队从队头取,始终保持“先来先处理”的顺序。这种简单的规则让队列在数据处理、任务调度等场景中发挥着重要作用。