用数组实现双端队列需用front、rear和size(或预留空位)三个变量,front指向首元素、rear指向尾后空位,通过取模实现循环复用;操作均需边界检查与正确取模。

用数组实现双端队列,核心是用两个索引(比如 front 和 rear)标记逻辑上的首尾位置,并借助循环方式复用空间,避免数组“假满”或“假空”。不是简单地在数组头尾硬插,而是靠索引移动+取模运算来模拟两端操作。
关键变量设计与含义
需要三个核心变量:
-
data[]:固定大小的数组,存实际元素(如
int data[MAX_SIZE]) - front:指向队列第一个元素的位置(左端/前端)
-
rear:指向最后一个元素的下一个空位(右端/后端),即左闭右开区间
[front, rear)
注意:初始化时通常设 front = rear = 0。此时队列为空;当 front == rear 也用于判空——但需配合容量判断满否,否则会和“全空”冲突。
判空与判满的可靠方案
仅靠 front == rear 无法区分空和满,所以推荐以下任一方式:
-
计数法(最直观):额外维护一个
size变量,每次插入加1、删除减1。
→ 空:size == 0;满:size == capacity -
预留空位法(常用):数组实际容量设为
capacity + 1,始终留一个空位。
→ 空:front == rear;满:(rear + 1) % capacity == front
推荐初学用计数法,逻辑清晰、不易出错。
四类操作的索引更新逻辑
所有操作都围绕 front 和 rear 的移动展开,注意取模防止越界:
-
左端入队(push_front):
→front = (front - 1 + capacity) % capacity(先挪指针,再赋值)
→data[front] = value -
右端入队(push_back):
→data[rear] = value
→rear = (rear + 1) % capacity(先赋值,再挪指针) -
左端出队(pop_front):
→ 记录data[front],然后front = (front + 1) % capacity -
右端出队(pop_back):
→rear = (rear - 1 + capacity) % capacity(先挪指针),再取data[rear]
例如容量为 5 的数组,当前 front=3, rear=1,表示元素分布在索引 3→4→0,共 3 个。此时 push_front 会把新元素放索引 2,push_back 放索引 1。
实战中容易忽略的细节
写代码时要盯住三点:
-
边界检查必须前置:每次入队前调
isFull(),出队前调isEmpty(),否则访问非法内存或逻辑崩溃 -
取模运算别漏加 capacity:如
(front - 1) % capacity在负数时可能出负索引,应写成(front - 1 + capacity) % capacity - front/rear 的语义要统一:一旦选定“rear 指向空位”,所有操作都按此理解,不要中途混用“rear 指向末元素”
调试时可打印 front、rear、size 和数组内容,比单步跟踪更高效。

















