Skip to content

队列

队列(Queue)是一种先进先出(FIFO, First-In-First-Out)的受限线性表——只允许在一端(队尾 rear)插入、在另一端(队头 front)删除,从而保证了「先来先服务」的公平顺序。它的核心操作只有三个:enqueue(入队,O(1))、dequeue(出队,O(1))、peek(查看队头,O(1))。实现上既有基于数组+头指针的顺序队列,也有基于链表+头尾指针的链式队列,而工程中为了解决「数组头删 O(n)」和「假溢出」问题,几乎都采用循环队列(下标对容量取模)。除了普通队列,还有双端队列(deque)——两端都能进出,以及优先队列(priority queue)——出队按优先级而非时间序(底层是堆)。

队列的全部考点都源于一个核心事实:FIFO ⇒ 天然适合「按层 / 按到达顺序」处理。由此衍生出三大主题:①实现与边界(顺序 vs 链式、循环队列的取模与判空判满三种方式、设计循环队列);②双端队列与单调队列(deque 的双端操作、滑动窗口最大值的单调队列解法);③工程应用(BFS 层序遍历、任务调度、生产者-消费者的阻塞队列、消息队列、JS 异步任务队列)。其中循环队列的取模运算单调队列是面试高频套路,BFS 则是队列最重要的算法应用——把 DFS 的「深度优先」换成「广度优先」,天然用队列维护「待访问层」。

评价

优点

  • 两端 O(1) 操作:入队 enqueue 在队尾、出队 dequeue 在队头,都是 O(1)——这是队列区别于数组的核⼼优势(数组头删要 O(n) 整体搬移)
  • 严格 FIFO 公平:先进先出保证「先到先服务」,是任务调度、BFS、缓冲区的天然语义
  • 实现灵活:可用数组(循环队列)或链表实现,循环队列复用空间、链式队列动态扩容无上限
  • 承载面广:BFS(层序遍历)、操作系统进程调度、生产者-消费者、消息队列、JS 事件循环都以它为核心

缺点

  • 访问受限:只能操作两端,不能按下标随机访问中间元素(a[i] 不是 O(1))——这是它区别于数组/链表的代价
  • 顺序队列的假溢出:基于数组+头指针的简单实现,出队后队头前的空间无法复用,会「明明有空却判满」——必须用循环队列解决
  • 普通队列不保证优先级:FIFO 严格按到达顺序,若要「优先级高的先出」需升级为优先队列(堆),实现复杂度上升

本叶地图

  • 入门 —— FIFO 定义、核心操作 O(1)、顺序队列 vs 链式队列、循环队列与假溢出、双端队列 deque、队列 vs 栈
  • 循环队列与双端队列 —— 循环队列的取模与判空判满三种方式、设计循环队列(LeetCode 622)、双端队列原理与应用、滑动窗口最大值(单调队列)
  • 队列的工程应用 —— BFS 层序遍历、任务调度、生产者-消费者、消息队列、优先队列引入、JS 异步任务队列
  • 参考 —— 队列 API 速查、复杂度表、各语言队列对照、循环队列判空判满、易错点

交互演示

幻灯片地址

队列

测试题

队列测试题