思路分析
-
front指向队列的第一个元素,且front的初始值为0
-
rear指向队列最后一个元素的下一个位置,因为希望空出一个空间做约定,rear的初始值为0
注意:为什么要留有一个空位置呢
若不留有空位置,rear指向队列的末尾元素的下一个位置,会导致队满的时候与队空的时候判断条件会是一样的,都是rear == front -
当队列满时,条件是(rear + 1)% maxSize = front
-
队列为空的条件,rear == front
-
这样分析时,队列中有效元素的个数为(rear + maxSize - front) % maxSize
-
这样就能够得到一个环形队列
代码实现
class CircleQueue{
private int maxSize;
private int front;
private int rear;
private int[] shuzu;
public CircleQueue(int maxSize) {
this.maxSize = maxSize;
this.shuzu = new int[maxSize];
this.front = 0;
this.rear = 0;
}
/**
* 添加元素
* @param i
*/
public void addQueue(int i){
//判断队列是否满
if(isFull()){
System.out.println("队列满了,无法再进入了");
}else{
shuzu[rear] = i;
rear = (rear + 1) % maxSize;
}
}
/**
* 移除元素
*/
public void removeQueue(){
//判断队列是否为空
if(isEmpty()){
System.out.println("队列为空,无元素可以移除");
}else{
front = (front + 1) % maxSize;
}
}
/**
* 判断队列是否满
* @return
*/
public boolean isFull(){
return (rear + 1) % maxSize == front ? true : false;
}
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty(){
return front == rear ? true : false;
}
/**
* 打印数组
*/
public void print(){
for(int i = front;i < front + size();i++){
System.out.printf("%d\t",shuzu[i % maxSize]);
}
}
/**
* 求循环队列目前元素个数
*/
public int size(){
return (rear + maxSize - front) % maxSize;
}
}