注意点:
队列的特点:
先进先出,队列的输出、输入是通过数组的前后端进行操作,即队列的输入从数组的尾部进入,队列的输出从数组的头部输出
代码实现需要声明的属性:
front:头指针,本章操作环形队列的思路:front指向队列的头结点,也就是说arr[front]为队列的第一个元素
rear:尾指针,本章操作环形队列的思路,rear指向队列尾结点的后一位,并将数组的最后一位空出,作为约定
maxSize:数组的最大容量
arr[]:声明一个数组用来存放队列
代码实现:
1、通过构造器初始化声明:front/rear/maxSize
private CircleQueue(int size){
maxSize = size;
front= 0;//初始化声明头结点和尾结点相同,皆为0
rear = 0;
}
2、判断队列是否为空(思路:头指针和尾指针相同的情况下,为空)
public boolean isEmpty(){
return rear == front;
}
3、判断队列是否已满(思路:通过“取模“”来实现判断:(rear+1)%maxSize == front
public boolean isFull(){
return (rear+1)%maxSize == front
}
4、得到队列中的总元素(注意点:需要注意队列是否为空)
public int getSize(){
//首先判断队列是否为空
if(isEmpty){
//为空则直接抛出异常
throw new RuntimeException("队列为空!")
}
//否则获得队列总个数
return (rear+maxSize-front)%maxSize;
//这里可以这么理解 (当前个数+总容量) %总容量 从而得到当前个数
}
4、开始往队列里面添加元素(注意点:首先要判断队列是否已满,添加元素后,rear指针需要后移)
public void addQueue(int num){
//判断队列是否已满
if(isFull){
System.out.println("队列已满,无法添加元素");
return;
}
//否则往队列中加入元素
arr[rear] = num;//数组元素赋值
rear = (rear+1)%maxSize //此时rear指针后移一位
}
5、查看队列(注意点:需要判断队列是否为空)
public void show(){
//判断队列是否为空
if(isEmpty){
throw new RuntimeException("队列为空");
}
//否则遍历队列
for(int i = front,i<front+getSize();i++){
System.out.prinf("arr[%d] = %d\n",i%maxSize,arr[i%maxSize]);
}
}
6、显式队列的头部数据
public int headQueue(){
if(isEmpty){
System.out.print("队列为空");
}
//查看头部元素
return arr[front];
}
7、出队列操作(注意点:判断队列是否为空,front指针在取出数据后需要移动)
public void outQueue(){
//判断队列是否为空
....此处省略
//出队列从队列头部出,指针front变化
int temp = arr[front];
front = (front+1)%maxSize;//front指针移动
System.out.prinf("取出的数据是:%d"+temp);
}
完成以上操作,即可完成队列的添加,取出和查看操作