1、思路分析java
上一篇講到用數組模擬隊列,數組沒法複用,下面講解了用數組模擬環形隊列的方法,採用取模的方式,使得數組能夠重複使用。 數組
首先先對front和rear的含義作了一個調整,front指向隊列的第一個元素,rear指向隊列最後一個元素的後一個位置。隊列滿的條件是(rear +1) % maxSize = front ,其中maxSize表示隊列的容量。假如maxSize=10, 犧牲掉一個位置,front = 0,此時若rear = 9,隊列就已經滿了。隊列爲空的條件是rear == front 。另外與上一篇不一樣的是,這裏的位置都不是絕對位置,而是須要%maxSize。ide
2、代碼實現oop
package com.atguigu.queue; import java.util.Scanner; public class CircleArrayQueueDemo { public static void main(String[] args) { // 測試一把 // 測試數組模擬環形隊列的案例 //建立一個隊列 CircleArray circleQueue = new CircleArray(4); char key = ' '; //接收用戶輸入 Scanner scanner = new Scanner(System.in); //掃描器 boolean loop = true; // 輸出一個菜單 while(loop) { System.out.println("s(show):顯示隊列"); System.out.println("e(exit):退出程序"); System.out.println("a(add):添加數據到隊列"); System.out.println("g(get):從隊列取出數據"); System.out.println("h(head):查看隊列頭的數據"); key = scanner.next().charAt(0);//接收一個字符 switch (key) { case 's': circleQueue.showQueue(); break; case 'a': System.out.println("請輸入一個數據:"); int value = scanner.nextInt(); circleQueue.addQueue(value); break; case 'g': try { int res = circleQueue.getQueue(); System.out.printf("取出的數據爲:%d\n",res); }catch(Exception e) { System.out.println(e.getMessage()); } break; case 'h': try { int res = circleQueue.headQueue(); System.out.printf("隊列頭的數據爲:%d\n",res); }catch(Exception e) { System.out.println(e.getMessage()); } break; case 'e': scanner.close(); loop = false; System.out.println("程序退出"); break; } } } } class CircleArray { private int maxSize; //表示數組的最大容量 //front 變量的含義作一個調整: front就指向隊列的第一個元素 //front 的初始值 = 0 private int front; //隊列頭 // rear 變量的含義作一個調整:rear指向隊列最後一個元素的後一個位置,但願預留一個空位做爲約定 private int rear; //隊列尾 private int[] arr; //該數組用於存放數據,模擬隊列 //建立隊列的構造器 public CircleArray(int arrMaxSize) { maxSize = arrMaxSize; arr = new int[maxSize]; } //判斷隊列是否已滿 public boolean isFull() { return (rear + 1) % maxSize == front; } // 判斷隊列是否爲空 public boolean isEmpty() { return rear == front; } //添加數據到隊列 public void addQueue(int n) { // 判斷隊列是否已滿 if(isFull()) { System.out.println("隊列滿,不能加入"); return; } arr[rear] = n; rear = (rear+1)% maxSize; //讓rear後移 } //獲取隊列的數據,出隊列 public int getQueue() { // 判斷隊列是否空 if(isEmpty()) { // 經過拋出異常 throw new RuntimeException("隊列空,不能取數據"); } int value = arr[front]; front = (front+1) % maxSize; //讓front後移 return value; } // 顯示隊列的全部數據 public void showQueue() { //遍歷 if(isEmpty()) { System.out.println("隊列空的,沒有數據"); return; } for (int i = front; i < front + size(); i++) { System.out.printf("arr[%d] = %d\n", i % maxSize,arr[i % maxSize]); } } //求出當前隊列有效數據的個數 public int size() { return (rear+maxSize-front) % maxSize; } //顯示隊列的頭數據,注意不是取出數據 public int headQueue() { if(isEmpty()) { throw new RuntimeException("隊列空的,沒有數據"); } return arr[front % maxSize]; } }