LeetCode解析------622.設計循環隊列-設計、隊列

題目:

設計你的循環隊列實現。 循環隊列是一種線性數據結構,其操作表現基於 FIFO(先進先出)原則並且隊尾被連接在隊首之後以形成一個循環。它也被稱爲“環形緩衝器”。

循環隊列的一個好處是我們可以利用這個隊列之前用過的空間。在一個普通隊列裏,一旦一個隊列滿了,我們就不能插入下一個元素,即使在隊列前面仍有空間。但是使用循環隊列,我們能使用這些空間去存儲新的值。

你的實現應該支持如下操作:

MyCircularQueue(k): 構造器,設置隊列長度爲 k 。
Front: 從隊首獲取元素。如果隊列爲空,返回 -1 。
Rear: 獲取隊尾元素。如果隊列爲空,返回 -1 。
enQueue(value): 向循環隊列插入一個元素。如果成功插入則返回真。
deQueue(): 從循環隊列中刪除一個元素。如果成功刪除則返回真。
isEmpty(): 檢查循環隊列是否爲空。
isFull(): 檢查循環隊列是否已滿。

示例:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 設置長度爲 3

circularQueue.enQueue(1); // 返回 true

circularQueue.enQueue(2); // 返回 true

circularQueue.enQueue(3); // 返回 true

circularQueue.enQueue(4); // 返回 false,隊列已滿

circularQueue.Rear(); // 返回 3

circularQueue.isFull(); // 返回 true

circularQueue.deQueue(); // 返回 true

circularQueue.enQueue(4); // 返回 true

circularQueue.Rear(); // 返回 4

簡單介紹:
題目:設計循環隊列
題目難度:中等
使用語言:JAVA。
這道題來自leetcode題庫的設計、隊列標籤。

解題思路:
首先看題、分析題意,我們可以明確1個關鍵點:
1.使用何種數據結構實現循環隊列
既然,我們已經分析出來題目的關鍵任務了,下面我們就可以開始思考實現了。
我們採用算法與數據結構的思路來剖析一下這題,

數據結構:
要實現對數據的操作,我們要先明確存儲數據的數據結構。
該題的數據結構的作用:
要實現循環隊列,可以利用數組的索引來模擬環狀結構,達到循環隊列的效果
1.數組:保存隊列元素(也可以使用單鏈表,內存消耗更少)

算法:
既然明確了我們的數據結構,我們就可以開始我們的算法分析了。
1.利用capacity與count判斷隊列是否已滿
2.利用(front+count-1)%capacity表示隊尾

代碼部分:

public class MyCircularQueue {
    int [] queue;//用數組實現隊列
    int count;//隊列實際擁有的元素個數
    int capacity;//隊列能保存最大的元素個數
    int front;//頭指針。尾指針省略,利用頭指針計算得出


    /* 構造函數*/
    public MyCircularQueue(int k) {
        queue = new int[k];
        count=0;
        capacity=k;
        front=0;
    }

    /* 插入循環隊列*/
    public boolean enQueue(int value) {
        if(capacity==count) return false;//隊列已滿
        queue[(front+count)%capacity]=value;//插入隊尾
        count++;//個數加1
        return true;
    }

    /*刪除隊列元素 */
    public boolean deQueue() {
        if(count==0) return false;
        front=(front+1)%capacity;
        count--;
        return true;
    }

    /*獲取隊頭元素*/
    public int Front() {
        
        if(count==0) return -1;
        return queue[front];

    }

    /*獲取隊尾元素*/
    public int Rear() {
        if(count==0) return -1;
        return queue[(front+count-1)%capacity];
    }

    /*判斷是否爲空*/
    public boolean isEmpty() {
        return (count==0);
    }

    /*判斷是否爲滿 */
    public boolean isFull() {
        return (count==capacity);
    }
}

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * MyCircularQueue obj = new MyCircularQueue(k);
 * boolean param_1 = obj.enQueue(value);
 * boolean param_2 = obj.deQueue();
 * int param_3 = obj.Front();
 * int param_4 = obj.Rear();
 * boolean param_5 = obj.isEmpty();
 * boolean param_6 = obj.isFull();
 */

在這裏插入圖片描述

結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

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