数据结构为
class CircleArray{ private int front; private int rear; private int maxSize; private int[] arrays; public CircleArray(int maxSize) { this.maxSize = maxSize; //队列的长度,比实际队列应用空间大1 arrays = new int[maxSize]; front = 0; //指向队列第一个元素 rear = 0; //指向队列最后一个元素的后一个位置,因此需要队列预留一个空间,所以呢数组最大空间要比实际应用大 } }
判断队列是否已经满了
public boolean isFull() { //这里是判断rear是否在预留位置上。也可以用(front-1+maxSize)%maxSize==rear进行判断, //预留位置可以理解为(front+队列实际空间)%maxSize的后一个位置,上面的(-1+maxSize)为队列实际空间 return (rear+1)%maxSize ==front; }
判断队列是否为空
public boolean isEmpty() { return rear==front; }
向队列添加数据
public void addQueue(int n) { if(isFull()) { System.out.println("队列已近满了,不能加入数据"); return; } arrays[rear] = n; rear = (rear+1)%maxSize; }
从队列取出数据
public int getQueue() { if(isEmpty()) { throw new RuntimeException("队列为空,不能取出数据"); } int result = arrays[front]; front = (front+1)%maxSize; return result; }
队列里面数据个数public int size() {
//这里可以这么理解
//当rear>front的时候 其实rear-front就是队列里面的数据个数
//当rear<front的时候,rear+(maxSize-front)就是队列里面的数据个数 return (rear-front+maxSize)%maxSize; }
显示队列
public void show() { if(isEmpty()) { System.out.println("队列为空。。。。"); return ; } int size = size(); for(int i=front;i<front+size;i++) { System.out.printf("a[%d] = %d\n",i%maxSize,arrays[i%maxSize]); } }