循环队列通过模运算实现首尾相连,解决普通队列因front/rear单向移动导致的“假溢出”空间浪费;其关键是以牺牲一个存储单元为代价,用front==rear判空、(rear+1)%n==front判满,实际容量为n−1。

用数组实现循环队列,核心是让队尾到达数组末尾后能“绕回”开头,从而复用已被出队腾出的前部空间,避免传统队列因“假溢出”导致的空间浪费。
为什么普通队列会浪费空间
普通顺序队列中,front 指向队首元素,rear 指向队尾元素的下一个位置。每次入队 rear++,出队 front++。当 rear 到达数组末尾(如 index = 9)时,即使 front 已前移(如 front = 3),前 3 个位置空着,却无法再入队——因为 rear 不能再往后走了。这叫“假溢出”,本质是未利用已释放的头部空间。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
循环队列的关键设计:模运算 + 空位判别法
把数组逻辑上首尾相连,所有移动都对数组长度 n 取模:
– 入队:rear = (rear + 1) % n
– 出队:front = (front + 1) % n
但仅靠取模还不够:满和空两种状态都会出现 front == rear。必须预留一个空位,用“牺牲一个存储单元”来区分:
- 队空条件:front == rear
- 队满条件:(rear + 1) % n == front(即再放一个就撞到 front)
- 实际可用容量 = n − 1(数组长度为 n)
代码实现要点(以 C/Java 风格示意)
定义结构体/类含:int[] data、int front、int rear、int capacity(= 数组长度):
- 初始化:front = rear = 0
- 入队前判断是否满:if ((rear + 1) % capacity == front) → 溢出
- 入队:data[rear] = x; rear = (rear + 1) % capacity
- 出队前判断是否空:if (front == rear) → 下溢
- 出队:x = data[front]; front = (front + 1) % capacity
- 当前元素个数:(rear − front + capacity) % capacity(避免负数)
常见易错点提醒
– 不要直接用 rear − front == capacity 判满(未取模时可能为负或超限)
– 初始化时 front 和 rear 必须同为 0(或同值),否则初始状态不一致
– 取模运算优先级低于加减,写成 (rear + 1) % capacity,别漏括号
– 若需存满 n 个元素,数组至少开 n+1 个位置










