队列
什么是队列?
队列就是一个序列表,它可以用数组或链表来进行实现,遵循的原则是先进先出。也就是说先存入的数据就先取出,反之亦然。
一、首先介绍以数组实现队列
->队列本身是有序列表,使用数组的结构来存储队列的数据,如上图所示。
->因为队列的输出、输入分别从头尾处理,所以需要定义两个变量front和rear来分别记录队列的首尾下标,front会随着数据的取出而改变,而rear会随着数据的进入而改变。数组的最大容量为maxSize。
思路分析:①将尾指针向后移:rear+1,当front==rear(代表队列此时为空)
②若为指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数据元素中,否则无法存入数据。rear==maxSize-1(队列此时已满)
用此方法来实现的队列只能一次性对数据进行存取,无法重复利用,所以需要用数组来模拟环形队列。
思路分析
1.首先front变量指向队列的第一个数据
2.rear指向队列的最后一个数据的后一个位置
由上图可知此时的队列是一个可以重复读取的队列,那么此时判断队列的空满条件就会发生改变,具体如下:
1、当队列为空时:front==rear
2.当队列满时:(rear+1)%maxSize==front
3.队列中的有效数据个数为:
==(rear+maxSize-front)%maxSize==
综上所述,模拟环形队列代码如下:
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) % maxSize == front;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//添加数据到队列中
public void addQueue(int n){
if (isFull()){
System.out.println("队列满,不能添加数据");
return;
}
arr[rear] = n;
rear = (rear + 1) % maxSize;
}
//获取队列的数据
public int getQueue(){
if (isEmpty()){
System.out.println("队列为空,无法获取数据");
}
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
//显示队列的所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空,没有数据");
return;
}
for (int i=front;i< front + size();i++){
System.out.println("arr["+ i%maxSize +"]" + "=" + arr[i%maxSize]);
}
}
//队列中有效数据
public int size(){
return (rear + maxSize - front) % maxSize;
}
//显示队列的头部
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空,没有数据");
}
return arr[front];
}
}