分析说明
1. 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意(rear+1)%maxSize == front (满)
2. Rear == front (空)
3. 分析思路
1)front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素,front的初始值 = 0
2)rear指向队列的最后一个元素的后一个位置,希望空出一个空间作为约定,rear的初始值 = 0
3)当队列满时,条件是(rear+1)%maxSize = front(满)
4)当队列为空的条件,rear == front(空)
5)队列中的有效数据个数(rear + maxSize -front) % maxSize
6)这样我们就可以在原来的基础上修改得到,一个环形队列
约定的含义
我们可以发现,当循环队列属于上图的情况时,是无法判断当前状态是队空还是队满。为了达到判断队列状态的目的,可以通过牺牲一个存储空间来实现。
代码实现
//使用数组模拟队列-编写一个CircleArray类
class CircleArray {
//表示数组的最大容量
private int maxSize;
//指向队列的第一个元素
private int front;
//队列指向队列的后一个元素的后一个位置,空出一个位置
private int rear;
//数组用于存放数据,模拟队列
private int[] arr;
//创建队列的构造器
public CircleArray(int arrMaxSize) {
maxSize = arrMaxSize;//最大容量
arr = new int[maxSize];//格式化数组
}
//判断队列是否满
public boolean isFull() {
return (rear + 1