环形队列
优点:高复用
思路:
定义一个头指针front,指向队列中的第一个元素,初始值 front=0;
定义一个尾指针rear,指向队列的最后一个元素的后一个位置,即预留出一个空闲位置,构成环形,初始值rear=0;
队列空:front==rear;
队列满:(rear+1)% maxSize == front;
队列中的有效数据个数:(maxSize+rear-front)% maxSize;
代码实现
private int maxSize; //队列的最大容量
private int front; //队列的第一个元素
private int rear; //队列的最后一个元素的后一个位置,即指向的位置是预留出来的位置,空出来构成环形
private int queueArray[]; //环形队列
//初始化队列
public loopQueueArray(int maxSize) {
this.maxSize = maxSize;
queueArray = new int[this.maxSize];
rear = 0;
front = 0;
}
/**
* 判断队列是否为空
*/
public boolean isNull() {
return rear == front;
}
/**
* 判断队列是否已满
*/
public boolean isFull() {
return (rear+1)%maxSize == front;
}
/**
* 添加队列元素
*/
public void addQueue(int number) {
//判断队列容量是否已满
if(isFull()) {
System.out.println("\n已达到最大存储容量,无法在继续添加\n");
return;
}
queueArray[rear] = number;
rear = (rear+1)%maxSize;
}
/**
* 出队列的元素
*/
public int getQueue() {
//判断队列是否为空
if(isNull()) {
throw new RuntimeException("队列中没有元素");
}
//定义临时变量,存储取出的值,再操作front
int temp = queueArray[front];
front = (front+1)%maxSize;
return temp;
}
/**
* 显示队列中的元素
*/
public void showAllQueue() {
//判断队列是否为空
if(isNull()) {
System.out.println("\n队列中没有元素\n");
return;
}
System.out.println();
//确定队列中有几个有效元素:rear
for(int i=front;i<front+(maxSize-front+rear)%maxSize;i++) {
System.out.println("queueArray["+(i%maxSize)+"]="+queueArray[i%maxSize]);
}
System.out.println();
}