題目:
設計你的循環隊列實現。 循環隊列是一種線性數據結構,其操作表現基於 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();
*/
結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!