跳到正文

3.2.1 队列的基本概念

40 分钟

3.2.1 队列:从一端进入,从另一端离开

队列只允许在队尾插入、队头删除,遵循 FIFO。front 指向队头一侧,rear 指向队尾一侧;具体指向元素还是空位要由实现约定。抽象接口包括入队、出队、读队头和判空。

手工推演:空队列依次 enqueue A,B,C; dequeue; enqueue D; dequeue,从队头到队尾的状态是 [A][A,B][A,B,C][B,C][B,C,D][C,D],两次出队返回 A、B。队列不会因为数组下标回绕就改变逻辑先后。

队列适合处理“按到达顺序服务”的任务,如打印作业、消息缓冲,以及图的广度优先搜索。栈保留最近尚未完成的状态,队列保留最早尚未处理的状态;选择依据是问题需要 LIFO 还是 FIFO。

输入受限双端队列、输出受限双端队列是后续变体,但普通队列不能在队头插入或队尾删除。优先队列也不按纯到达顺序出队,它根据优先级选择元素,逻辑规则已经不同。

错解反馈:把 front/rear 的大小直接当元素数,在循环实现中会因回绕出错;把“先入先出”解释为较小值先出,混淆到达顺序与关键字顺序;认为队列只能用数组,忽略链式实现。

迁移题:任务到达顺序为 P1、P2、P3,服务 P1 后 P4 到达,再服务一次,返回谁?答案 P2,剩余顺序 P3、P4。独立验收:能画出每次操作后的逻辑队列,并说明三个实际场景为什么需要 FIFO。

小纸条

推演:入A、B、C,出一次,入D,再出一次,返回值和剩余队列是什么?

登录 后可看答案

Practice

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。