例题:https://leetcode-cn.com/problems/design-circular-queue/

  1. 数组队列才需要用到循环队列。
  2. 链表队列由于可以无限扩大无元素数量限制,所以不用循环。

前提

  1. 数组中始终空一格不储存元素。即数组大小为maxSize , 队列长度为 maxSize - 1;
  2. 可以让Front 始终为null 或让Rear始终为null
  3. 若Front 始终为null ,则入队时Rear先移动再赋值;若Rear始终为null,则入队时Rear先赋值再移动
  4. 队列能进行循环的关键操作:%maxSize,即对最大长度取余

以下所有步骤我们以Rear始终为null进行描述

设计

1
2
3
4
5
6
7
8
9
10
class Queen{
int[] array; //储存元素的数组
int Rear; // 队尾索引,初始为0
int Front; // 队头索引,初始为0
int maxSize; // 数组大小

public Queen(){
array = new int[maxSize];
}
}

判断队空

1
if( Front == Rear )

判断队满

1
if( (Rear + 1) % maxSize == Front )

入队

1
2
3
4
5
6
7
// 先判断是否队满
if( (Rear + 1) % maxSize == Front ){
return 入队失败
}

array[Rear] = val;
Rear = ( Rear + 1 ) % maxSize;

出队

1
2
3
4
5
6
// 先判断是否队空
if( Rear == Front ){
return 出队失败
}

Front = ( Front + 1 ) % maxSize;