陣列模擬佇列 以及佇列的複用(環形佇列)

雨聽風說發表於2020-09-10

使用陣列模擬佇列

初始化佇列

private int front; 指向佇列頭的第一個元素

privat int maxSzie; 設定佇列的最大長度

private int rear; 指向佇列尾的最後一個元素的後一個位置,留出一個位置作為約定

因為需要留出一個位置作為約定,那麼當陣列的maxSize == 4;的時候有效資料的個數就等於3個

private int[] arr; 使用陣列來儲存資料,模擬環形佇列

那麼佇列就會形成一個圓環形狀的 如下圖:

通過分析可以得出front == rear的時候環形佇列是空的

當對列滿的時候就是 (rear + 1) % maxSize == front;

佇列的有效資料個數(rear + maxSize - front) % maxSize;

佇列的有效資料個數就可以用來遍歷出整個環形佇列的有效值

遍歷從front頭指標開始

程式碼實現:

通過開始判斷出來的思路,寫程式碼實現

佇列的判空和判滿

 /**
     * 用來判斷環形佇列是否滿的狀態
     *
     * @return
     */
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

    /**
     * 判斷佇列是否為空
     *
     * @return
     */
    public boolean isEmpty() {
        return rear == front;
    }

向環形佇列中新增一個元素和取出元素

 /**
     * 向佇列新增一個元素
     *
     * @param number
     */
    public void addQueue(int number) {
        if (isFull()) {
            System.out.println("佇列滿,無法加入資料·····");
            return;
        }
        arr[rear] = number;
        //將rear後移,向後移動指標的時候必須要考慮取模,不然就會造成陣列越界
        rear = (rear + 1) % maxSize;
    }

    /**
     * 從佇列中取出一個元素
     *
     * @return
     */
    public int getQueue() {
        if (isEmpty()) {
            new RuntimeException("當前佇列為空,不能取出資料");
        }
        /**
         * front 指向佇列的第一個元素
         * 1、先吧front儲存在一個臨時變數
         * 2、將front後移,後移指標的時候一樣必須考慮取模,否則也會造成陣列越界
         * 3、將臨時儲存的變數返回
         */

        int val = arr[front];
        front = (front + 1) % maxSize;
        return val;
    }

顯示佇列的所有元素--難點

最重要的是需要計算出來陣列中有多少個有效數值

通過思路分析已經得初有效數值的個數(rear + maxSize - front) % maxSize; 這就是陣列的有效資料個數

並且陣列的第一個元素是從front開始,那麼就需要從front開始遍歷

for(int i = front ; i < front + ((rear + maxSize - front) % maxSize); i++){
    //在遍歷的時候必須要考慮取模,不然就會陣列越界
    System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
}

具體的程式碼實現為:

/**
     * 顯示佇列所有元素
     *
     * @return
     */
    public void showQueue() {
        if (isEmpty()) {
            //當前佇列為空,不能取出資料
            System.out.println("佇列為空,沒有資料·····");
            return;
        }
        //思路:從front開始遍歷,遍歷多少個元素呢
        for (int i = front; i < front + size(); i++) {
            System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
        }
    }

    /**
     * 求出當前佇列的有效資料的個數
     *
     * @return
     */
    public int size() {
        return (rear + maxSize - front) % maxSize;
    }

輸出佇列的第一個元素

因為 front指向的就是佇列頭的第一個元素,那麼arr[front]就是第一個元素

 /**
     * 取出佇列頭元素
     *
     * @return
     */
    public int headQueue() {
        if (isEmpty()) {
            new RuntimeException("佇列為空,不能取出資料·····");
        }
        return arr[front];
    }

整篇原始碼檢視

gitee:環形佇列

github:環形佇列

相關文章