迴圈佇列的實現關鍵是在於隊首隊尾兩個指標的關係
front 頭指標
rear 尾指標
定義資料結構:大小,頭尾指標,陣列arr
private int size;private int front;private int rear;private int[] arr;
構造方法傳入size
//構造器初始化,傳入一個引數,sizepublic CircleArray(int size){ this。size = size; arr = new int[size];//初始化佇列大小 this。front = 0;//可以省 this。rear = 0;//可以省}
四個核心方法
push :
不是rear ++ ,
rear = (rear + 1) % size;
pop: 不是front++,
front = (front + 1) % size;
(難)curSize: 當前大小,
(rear + size - front) % size;
isEmpty: 比較頭尾指標是否相等
isFull : 比較
(rear + 1) % size == front;
//判斷佇列大小 public boolean isFull(){ return (rear + 1) % size == front; } public boolean isEmpty(){ return front == rear; } //push public void push(int n){ if(isFull()){ System。out。println(“queue is full”); return; }// rear++;// arr[rear] = n;//普通佇列的寫法 arr[rear] = n; rear = (rear + 1) % size;//這裡秒 } //pop public int pop(){ if(isEmpty()){ System。out。println(“queue is empty”); throw new RuntimeException(“queue is empty”); } //將front 臨時儲存指向的變數,直接彈出無法右移指標 //將front 右移 //返回front 指向的變數 int temp = arr[front]; front = (front + 1) % size; return temp; } //當前size public int curSize(){ //rear = 1, front = 0 , size = 3; return (rear + size - front) % size; } //show public void show(){ if(isEmpty()){ System。out。println(“queue is empty”); throw new RuntimeException(“queue is empty”); } for (int i = front; i < front + curSize(); i++) { System。out。printf(“arr[%d]=%d\n”, i % size, arr[i % size]); } } //顯示隊首; public int getFront(){ if(isEmpty()){ System。out。println(“queue is empty”); throw new RuntimeException(“queue is empty”); } return arr[front]; }
測試一把:
public static void main(String[] args) { //例項化 CircleArray queue = new CircleArray(4); System。out。println(queue。curSize()); queue。push(100); queue。push(80); queue。push(70); queue。push(60); queue。push(50); System。out。println(queue。curSize()); System。out。println(queue。getFront()); System。out。println(queue。isFull()); System。out。println(queue。pop()); System。out。println(queue。isFull()); queue。show();}