數組模擬隊列 以及隊列的複用(環形隊列)

使用數組模擬隊列

初始化隊列

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:環形隊列

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章