>> >> >> Reference << << << <<<<<<Ref>>>>>>
Queue
Modified: 2025-12-31 | Author:ljf12825

Queue(队列)

基本特性

逻辑结构

┌─────────────────────────────────────────┐
│                 Queue                   │
├──────────┬──────┬──────┬──────┬─────────┤
│   Front  │      │      │      │   Rear  │
│  (Head)  │      │      │      │  (Tail) │
├──────────┴──────┴──────┴──────┴─────────┤
│   ^ 出队方向               入队方向 ^   │
│   <──────────────────────────────────── │
└─────────────────────────────────────────┘

状态演变

初始状态(空队列):
┌───┬───┬───┬───┬───┬───┐
│   │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┘
^
front = rear = 0

入队元素 A:
┌───┬───┬───┬───┬───┬───┐
│ A │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┘
↑      ^
front  rear

入队元素 B, C:
┌───┬───┬───┬───┬───┬───┐
│ A │ B │ C │   │   │   │
└───┴───┴───┴───┴───┴───┘
^            ^
front        rear

出队元素 A:
┌───┬───┬───┬───┬───┬───┐
│   │ B │ C │   │   │   │
└───┴───┴───┴───┴───┴───┘
     ^       ^
    front   rear

操作

实现

基本队列(Naive Queue)

基于数组的实现

这是一种很直观的做法,但是非常不推荐\

实现方式

操作很简单,但是会造成以下问题

这种做法仅适用于理解队列状态变化
工业级基于数组的实现是Circular Queue

基于链表的实现

这是正统的做法

特点

head -> [A] -> [B] -> [C] -> null

双端队列(Deque)

Deque(Double Ended Queue),可以在队头和队尾进行插入和删除操作的数据结构

操作含义时间复杂度
push_front从头部插入O(1)
push_back从尾部插入O(1)
pop_front从头部删除O(1)
pop_back从尾部删除O(1)

逻辑结构

┌─────────────────────────────────────────┐
│               Deque                     │
├───────┬─────────┬─────────┬─────────────┤
│ Front │         │         │     Rear    │
│ (Head)│         │         │    (Tail)   │
├───────┴─────────┴─────────┴─────────────┤
│  ← 出/入队方向        出/入队方向 →     │
└─────────────────────────────────────────┘

状态演变

初始状态:
┌───┬───┬───┬───┬───┐
│   │   │   │   │   │
└───┴───┴───┴───┴───┘

从前端添加 X,从后端添加 Y:
┌───┬───┬───┬───┬───┐
│ X │   │   │   │ Y │
└───┴───┴───┴───┴───┘
 ↑               ↑
front          rear

继续从前端添加 A,从后端添加 B:
┌───┬───┬───┬───┬───┐
│ A │ X │   │ Y │ B │
└───┴───┴───┴───┴───┘
 ↑           ↑
front      rear

实现

双向链表实现
结构
node <-> node <-> node
优点
缺点

高性能场景不会使用这个版本

循环数组

这是最常见的手写实现

核心思想

用一个数组 + 两个索引

[ _ _ A B C D _ _ ]
      ↑       ↑
    head    tail

索引取模

next = (i + 1) % capacity;
结构
buffer[]
head index
tail index
size
优点
缺点
STL风格分段数组

这是std::deque的真实实现方式

结构类似这样

[block][block][block][block]
   ↓      ↓
 [64]   [64]

本质是指针数组 -> 每个指针指向一个小块连续内存

优点
缺点

使用场景

Deque的接口简单,底层实现高度工程化
适合用于两端高频操作的场景
Deque是系统级最重要的数据结构之一
简单程度像队列,工程价值像内存管理器
算法领域Deque是万金油

不该使用Deque的场景

一旦开始用Deque的中间索引访问元素,说明选错结构了

优先队列(Priority Queue)

循环队列(Circular Queue)

阻塞队列(Blocking Queue)

应用场景

  1. BFS
  2. 生产者/消费者模型
  3. 任务调度/消息系统
  4. 单调队列