數據結構為
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]); } }