循环队列的作用是为了解决假溢出的问题。
消除假溢出就是当队尾指针rear和队头指针front到达存储空间最大值QueueSize时,让队尾指针自动转化为存储空间的最小值0。
再插入数据 6
下面就说明如何实现上面的操作。
想要实现这些主要要明白几个判断条件和下标的转换。
- 队空时:front与rear相等。
- 当尾指针rear和头指针front有效确定队列中有效数据的头尾:
front%data.length, rear%data.length
- 如何获取队列数据长度:(rear-front+data.length)%data.length,要加上data.length再取余的原因是因为有两种情况front<=rear和front>rear,当小于时就正常减就行,而大于时减后的值是空出来的空间,再加上数组长度,就最后得出来真实数据长度了。
- 判断什么时候队列满了,因为如果front=rear来判断队列满了,就会和判空产生歧义性,所以我们空单元法来解决这种二义性问题。认为的浪费一个单元令队满特征为
front%data.length == (rear+1)%data.length,
- 这上面front取余和rear进行取余最后得到的就是其真正的数组下标。
public class CircularQueue {
public int[] data = new int[5];
public int rear = 0;
public int front = 0;
public void push(int a){
if(front%data.length == (rear+1)%data.length){
System.out.println("队列满了,插入不进去");
}else {
System.out.println("插入了数据a"+a+"再数组下标为"+rear%data.length);
data[rear++%data.length]=a;
}
}
public int pop(){
if (rear==front){
System.out.println("对列以空");
return 0;
}
System.out.println("取出数值是"+data[front%data.length]);
return data[front++%data.length];
}
public int getLength(){
return (rear-front+data.length)%data.length;
}
}