迴圈佇列解決空陣列不能新增資料的問題
阿新 • • 發佈:2021-08-23
public class CircleArrayQueueDemo { public static void main(String[] args) { System.out.println("測試模擬環形佇列的案例~"); //有效個數3個,因為有一個空位 CircleArrayQueue queue = new CircleArrayQueue(4); char key = ' '; Scanner scanner = new Scanner(System.in); boolean loop = true; while(loop){ System.out.println("s:顯示佇列"); System.out.println("e:退出程式"); System.out.println("a:新增資料到佇列"); System.out.println("g:從佇列取出資料"); System.out.println("h:檢視佇列頭的資料"); key = scanner.next().charAt(0); switch (key) { case 's': queue.showQueue(); break; case 'a': System.out.println("請輸入一個數:"); int num = scanner.nextInt(); queue.addQueue(num); break; case 'g': try { int result = queue.getQueue(); System.out.printf("取出的資料是%d\n",result); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'h': try { int result = queue.headQueue(); System.out.printf("佇列頭的資料是%d\n",result); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'e': scanner.close(); loop = false; break; default: break; } } System.out.println("程式退出"); } } class CircleArrayQueue{ //佇列的最大容量 private int maxSize; //front變數的含義做一個調整:front就指向佇列的第一個元素, //也就是說arr[front]是佇列的第一個元素 //front的初始值是0 private int front; //rear變數的含義做一個調整:rear就指向佇列的最後一個元素的後一個位置, //因為希望空出一個位置做為約定 //rear的初始值是0 private int rear; //該陣列用於存放資料,模擬佇列 private int[] arr; //初始化佇列資料 public CircleArrayQueue(int maxSize){ this.maxSize = maxSize; this.arr = new int[maxSize]; this.front = 0; this.rear = 0; } //判斷佇列是否滿 public boolean isFull(){ return (this.rear + 1) % this.maxSize == this.front; } //判斷佇列是否為空 public boolean isEmpty(){ return this.rear == this.front; } //新增資料到佇列 public void addQueue(int num){ if(isFull()){ System.out.println("佇列已滿,請稍後再新增。"); return; } this.arr[this.rear] = num; //rear後移,這裡必須考慮取模,因為比如說已經到最後一個位置, //直接+1複製的話,那麼就越界了,所以需要對maxSize取模 this.rear = (this.rear + 1) % this.maxSize; } //獲取佇列資料,出佇列 public int getQueue(){ if(isEmpty()){ throw new RuntimeException("佇列為空,不能取資料。"); // System.out.println("佇列為空。"); // return -1; } //這裡需要分析出:front是指向佇列的第一個元素 //1、先把front對應的值保留到一個臨時變數; //2、將front後移; //3、將臨時儲存的變數返回 int value = this.arr[this.front]; this.front = (this.front + 1) % this.maxSize; return value; } //顯示佇列的所有資料 public void showQueue(){ if(isEmpty()){ System.out.println("佇列為空。"); return; } for (int i = this.front; i < this.front + size(); i++) { System.out.printf("arr[%d]=%d\n", i % this.maxSize,arr[i % this.maxSize]); } } //求出當前佇列的有效資料個數 public int size(){ //rear = 2 //front = 1 //maxSize = 3 return (this.rear + this.maxSize - this.front) % this.maxSize; } //顯示佇列的頭資料,不是取資料 public int headQueue(){ if(isEmpty()){ throw new RuntimeException("佇列為空。"); } return this.arr[this.front]; } }