目的
让数组达到复用的效果,当数组中的数取出时,就没办法二次利用,所以有环形队列。
思路
- front的含义做调整 :front由原来的指向队列头的前一个位置调整为现在的front指向了队列头,即front=-1变为front=0
- rear的含义做调整:rear从原来指向队列的最后一个数据调整为了现在的rear指向队列的最后一个数据的前一个位置,预留一个空间作为约定。即环形队列数组大小初始化为maxSize时,只可以存maxSize-1个元素;
arr[rear] = n;
rear ++;
rear = rear % maxSize;
这是进行存储元素时的程序;当元素存储到arr[maxSize-2]后,此时rear=maxSize-1;也就是说此时rear已经指向了maxSize-1的位置,由此队列满的的条件(rear + 1) % maxSize)== front
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210408204403729.png
存满时rear和front的指向
1. 当无元素取出时
2 当有元素取出时
环形数组的容量
源码如下
(rear + maxSize - front) % maxSize
class CircleArrayQueue{
private int maxSize;
private int rear = 0;
private int front = 0;
private int[] arr;
public CircleArrayQueue(int maxSize) {
super();
this.maxSize = maxSize;
arr = new int[this.maxSize];
}
/**
*
* @Description 判断队列是否已满
* @author DouLarry
* @date 2021年4月8日上午10:19:20
* @return
*/
public boolean isFull() {
return ((rear + 1) % maxSize) == front;
}
/**
*
* @Description 判断队列是否为空
* @author DouLarry
* @date 2021年4月8日上午10:19:49
* @return
*/
public boolean isEmpty() {
return front == rear;
}
/**
*
* @Description 向队列中添加数据
* @author DouLarry
* @date 2021年4月8日上午10:26:23
* @param n
*/
public void add(int n) {
if(isFull()) {
System.out.println("队列已满");
return ;
}
arr[rear] = n;
rear ++;
rear = rear % maxSize;
}
/**
*
* @Description 出队列,获取队列的元素
* @author DouLarry
* @date 2021年4月8日上午10:29:22
* @return
*/
public int pop() {
if(isEmpty()) {
throw new NullPointerException("队列为空");
}
int value = arr[front];
front ++;
front %= maxSize;
return value;
}
/**
*
* @Description 遍历队列
* @author DouLarry
* @date 2021年4月8日上午10:33:27
*/
public void show() {
if(!isEmpty()) {
int num = size();
for(int i=front;i<front+num;i++) {
System.out.print(arr[i%maxSize] + "\t");
}
}else {
System.out.println("队列为空");
}
}
/**
*
* @Description 获取队列的头
* @author DouLarry
* @date 2021年4月8日上午10:35:19
* @return
*/
public int getHead() {
if(isEmpty()) {
throw new NullPointerException("队列为空");
}
front %= maxSize;
return arr[front];
}
/**
*
* @Description 获取当前数组中有效的数值的个数
* @author DouLarry
* @date 2021年4月8日下午3:17:59
* @return
*/
public int size() {
return (rear + maxSize - front) % maxSize;
}
}