鹹魚學資料結構和演算法——佇列(陣列實現)
阿新 • • 發佈:2021-02-04
目錄
一、佇列介紹
- 佇列是一個有序列表,可以用陣列或是連結串列來實現。
- 遵循先入先出的原則。即:先存入佇列的資料,要先取出。後存入的要後取出。
二、陣列模擬佇列介紹
- 佇列本身是有序列表,若使用陣列的結構來儲存佇列的資料,則佇列陣列的宣告如下圖, 其中 maxSize 是該佇列的最大容量。
- 因為佇列的輸出、輸入是分別從前後端來處理,因此需要兩個變量 front及 rear分別記錄佇列前後端的下標,front 會隨著資料輸出而改變,而 rear則是隨著資料輸入而改變,如圖所示
- 資料存入佇列時稱為”addQueue”,addQueue 的處理需要有兩個步驟:
①將尾指標往後移:rear+1 , 當front == rear 【空】
②若尾指標 rear 小於佇列的最大下標 maxSize-1,則將資料存入 rear所指的陣列元素中,否則無法存入資料。 rear == maxSize - 1[佇列滿]
- 陣列模擬佇列示意圖
三、陣列模擬佇列程式碼實現
public class ArrayQueue<T> { public static void main(String[] args) { ArrayQueue<Integer> arrayQueue=new ArrayQueue<Integer>(5); for (int i=0;i<5;i++){ arrayQueue.addQueue(5-i); } System.out.println("----進佇列中資料為:-----"); arrayQueue.showQueue(); for (int i=0;i<2;i++){ arrayQueue.getQueue(); } System.out.println("---出佇列後的資料為:-----"); arrayQueue.showQueue(); } // 佇列的的最大容量 int maxSize; // 佇列的前端,初始值為0 int front; // 佇列的後端的後一個值,初始值為0 int rear; // 佇列陣列 T arr[]; // 初始化佇列 @SuppressWarnings("unchecked") public ArrayQueue(int arrMaxSize) { maxSize=arrMaxSize; arr=(T[])new Object [maxSize]; front =0; rear =0; } // 判斷佇列是否為空 public boolean isEmpty() { return front==rear; } // 判斷佇列是否為滿 public boolean isFull(){ return front>=maxSize-1; } // 加入佇列 public void addQueue(T value) { if(isFull()) { System.out.println("佇列已滿,無法新增"); return; } arr[rear]=value; rear++; } // 取出佇列 public T getQueue(){ if(isEmpty()) { throw new RuntimeException("佇列為空,無法取出"); } T value = arr[front]; front++; return value; } // 顯示佇列的所有資料 public void showQueue() { // 遍歷 if (isEmpty()) { System.out.println("佇列空的,沒有資料~~"); return; } // 思路:從front開始遍歷,遍歷多少個元素 // 動腦筋 for (int i = front; i < rear ; i++) { System.out.printf("arr[%d]=", i); System.out.println(arr[i]); } } public T headQueue() { // 判斷 if (isEmpty()) { throw new RuntimeException("佇列空的,沒有資料~~"); } return arr[front]; } }