設計你的迴圈佇列實現。 迴圈佇列是一種線性資料結構,其操作表現基於 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
我的**
/*迴圈佇列*/
public class mycircularqueue
/** insert an element into the circular queue. return true if the operation is successful. */
public boolean enqueue(int value) else
}/** delete an element from the circular queue. return true if the operation is successful. */
public boolean dequeue() else
}/** get the front item from the queue. */
public int front() else
}/** get the last item from the queue. */
public int rear() else
}/** checks whether the circular queue is empty or not. */
public boolean isempty()
/** checks whether the circular queue is full or not. */
public boolean isfull()
}
思路:
1、使用兩個指標f、t,初始設為0,分別指向佇列的頭(f)和佇列的尾(t)
2、判斷佇列空的依據: f=t
3、最開始給陣列開闢的空間比指定空間》1,即陣列長度cap=(指定空間k+1),原因如下:
假如開闢的空間=佇列滿時的長度,即cap=k;當佇列只剩下乙個空間的時候(即f=(t+1)%cap時),這是判斷為空,仍然可以插入元素,然而實際上佇列已滿。因此在鄧俊輝的資料結構和演算法中提出將佇列實際空間k設為比陣列空間小1,即k=cap-1;
4、判斷是否滿的依據:(t+1)%cap=f
5、取出佇列最後乙個元素的演算法:將下標為(t-1+cap)%cap的元素取出作為佇列的最後元素,這是為了解決當t=0時,t-1=-1會產生陣列越界異常,這樣當t=0時實際得到的是下標為cap-1的元素
2、思路中的第三個問題,還有另外一種解決方法就是用乙個變數專門儲存佇列的元素個數,**如下:
int cap;
int size;
//儲存佇列的實時長度
int f=0;
//指向佇列的第乙個元素
int t=0;
//指向佇列的最後乙個元素
object[
] q;
//用陣列儲存佇列元素
/** initialize your data structure here. set the size of the queue to be k. */
public
mycircularqueue
(int k)
/** insert an element into the circular queue. return true if the operation is successful. */
public
boolean
enqueue
(int value)
else
}/** delete an element from the circular queue. return true if the operation is successful. */
public
boolean
dequeue()
else
}/** get the front item from the queue. */
public
intfront()
else
}/** get the last item from the queue. */
public
intrear()
else
}/** checks whether the circular queue is empty or not. */
public
boolean
isempty()
/** checks whether the circular queue is full or not. */
public
boolean
isfull()
用陣列實現迴圈佇列(新思路)
用陣列實現乙個迴圈佇列,難點就在於如何判斷陣列是否滿了,不論是書上的方法,還是一些大佬的寫法,都是利用乙個計算去判斷 rear maxsize front maxsize 有的小夥伴天資聰穎一下就理解了,有的小夥伴可能理解不夠深刻,只能牢牢記住這個公式 在這裡我給大夥分享一種思路 其實上面的思路的本...
迴圈佇列 622 設計迴圈佇列
設計你的迴圈佇列實現。迴圈佇列是一種線性資料結構,其操作表現基於fifo 先進先出 原則並且隊尾被連線在隊首之後以形成乙個迴圈。它也被稱為環形緩衝器。迴圈佇列的乙個好處是我們可以利用這個佇列之前用過的空間。在乙個普通佇列裡,一旦乙個佇列滿了,我們就不能插入下乙個元素,即使在佇列前面仍有空間。但是使用...
佇列 陣列實現 迴圈佇列
1 陣列佇列.cpp 定義控制台應用程式的入口點。2 3 include4 include5 include abs 6 include7 include8 using namespace std 9 10 定義乙個佇列的結構體11 struct myqueue12 17 18 規則說明 19 nh...