1. 程式人生 > 其它 >鹹魚學資料結構和演算法——佇列(陣列實現)

鹹魚學資料結構和演算法——佇列(陣列實現)

技術標籤:演算法與資料結構佇列資料結構演算法

目錄

一、佇列介紹

二、陣列模擬佇列介紹

三、陣列模擬佇列程式碼實現


一、佇列介紹

  • 佇列是一個有序列表,可以用陣列或是連結串列來實現。
  • 遵循先入先出的原則。即:先存入佇列的資料,要先取出。後存入的要後取出。

二、陣列模擬佇列介紹

  • 佇列本身是有序列表,若使用陣列的結構來儲存佇列的資料,則佇列陣列的宣告如下圖, 其中 maxSize 是該佇列的最大容量。
  • 因為佇列的輸出、輸入是分別從前後端來處理,因此需要兩個變frontrear分別記錄佇列前後端的下標,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];
    }

}