用陣列設計迴圈佇列

2021-10-01 14:58:13 字數 3231 閱讀 6434

設計你的迴圈佇列實現。 迴圈佇列是一種線性資料結構,其操作表現基於 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...