首先準備基本類java
class CircleArray { private int maxSize; //表示隊列的最大容量 //front 就指向隊列的第一個元素,也就是說arr[front] //front 初始值 0 private int front; //rear 指向隊列的最後一個元素的後一個位置 //rear 的初始值 0 private int rear; private int[] arr; //用於存儲數據,模擬隊列 public CircleArray(int arrMaxSize) { this.maxSize = arrMaxSize; arr = new int[maxSize]; } }
public void addQueue(int n) { //判斷隊列是否滿 if (isFull()) { System.out.println("隊列滿,不能加入數據!"); return; } //直接將數據加入 arr[rear] = n; //讓rear後移,這裏必須取模,考慮數組下標越界 rear = (rear + 1) % maxSize; }
rear指向的是隊尾元素的後一個位置,與數組大小取模能夠解決下標越界問題數組
由於是指向的後一個位置,因此在添加時能夠先存入數組,再移動下標數據結構
public int getQueue() { //判斷隊列是否空 if (isEmpty()) { //經過拋出異常 throw new RuntimeException("隊列空,不能取數據"); } int val = arr[front]; front = (front + 1) % maxSize; return val; }
front直接指向的就是隊首的位置,由於是循環隊列,一樣要考慮下標越界this
出隊後,要向後移動下標,因此不能直接return出隊的元素,先保存出隊元素code
再移動front,最後return保存的出隊元素索引
public int peekQueue() { //判斷 if (isEmpty()) { throw new RuntimeException("隊列空,沒有數據"); } return arr[front]; }
public int size() { return (rear + maxSize - front) % maxSize; }
須要注意的是:隊列
rear的索引在front前面的狀況,在普通隊列中rear的索引大於front,能夠經過簡單的rear - front得出元素個數get
可是循環隊列會出現rear的索引小於front的狀況,簡單的相減會出現負數的狀況,顯然不符合要求,io
利用rear+maxSize可以使rear的索引大於front,而後相減的結果 % maxSize ,class
(rear + maxSize - front) % maxSize == rear - front
public void showQueue() { //遍歷 if (isEmpty()) { System.out.println("隊列空,沒有數據!"); return; } // 思路:從front開始遍歷,遍歷多少個元素 for (int i = front; i < front + size(); i++) { int index = i % maxSize; System.out.printf("arr[%d]=%d\n", index, arr[index]); } }
思路:算出隊列有效元素個數,從front位置開始打印,下標向後移動,取模防止下標越界,循環遍歷數組
public boolean isFull() { return (rear + 1) % maxSize == front; }
數組不填滿,隊首和隊尾之間空一個位置,即當元素存儲到隊列倒數第二個元素時,rear指向最後一個位置,
此時(rear + 1) % maxSize == front
public boolean isEmpty() { return rear == front; }