力扣 622 設計迴圈佇列

2021-10-13 09:57:43 字數 3048 閱讀 7989

設計你的迴圈佇列實現。 迴圈佇列是一種線性資料結構,其操作表現基於 fifo(先進先出)原則並且隊尾被連線在隊首之後以形成乙個迴圈。它也被稱為「環形緩衝器」。

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

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

mycircularqueue(k): 構造器,設定佇列長度為 k 。

front: 從隊首獲取元素。如果隊列為空,返回 -1 。

rear: 獲取隊尾元素。如果隊列為空,返回 -1 。

enqueue(value): 向迴圈佇列插入乙個元素。如果成功插入則返回真。

dequeue(): 從迴圈佇列中刪除乙個元素。如果成功刪除則返回真。

isempty(): 檢查迴圈佇列是否為空。

isfull(): 檢查迴圈佇列是否已滿。

空的迴圈佇列                                       滿的迴圈佇列

定義乙個迴圈佇列結構體,成員變數包括隊頭front、隊尾rear、佇列容量k和乙個用於儲存資料的int*型別的data指標。

重點在於迴圈佇列的判空和判滿條件如何設定。對於判空,我們容易想到front == rear這一條件。而判滿則不是rear + 1 == front。我們規定,佇列中保留乙個空白位置不儲存任何資料。以上圖為例,隊尾位於8,而隊頭位於1的位置,因此,應該使用(rear + 1) % (k + 1) == front來作為判滿條件(k為容量,即7,+ 1是為了把空白位置所佔的空間也計算入內)。

那麼接下來,我們使用c語言來實現迴圈佇列。

typedef

struct

mycircularqueue;

mycircularqueue*

mycircularqueuecreate

(int k)

注意,初始化佇列的時候,需要申請k + 1的記憶體空間,這一點與上文所述一致。

bool mycircularqueueisempty

(mycircularqueue* obj)

else

}bool mycircularqueueisfull

(mycircularqueue* obj)

else

}

bool mycircularqueueenqueue

(mycircularqueue* obj,

int value)

obj->_data[obj->_rear]

= value;

obj->_rear++;if

(obj->_rear > obj->_k)

return true;

}

入隊之前需要先判滿,若佇列內仍有空間,則將資料插入隊尾,再更新隊尾位置。由於佇列是迴圈的,若隊尾的位置已經大於容量,則將隊尾返回到0的位置。

bool mycircularqueuedequeue

(mycircularqueue* obj)

obj->_front++;if

(obj->_front > obj->_k)

return true;

}

同理,出隊之前需要先判空,若不為空則更新隊頭,同樣需要注意隊頭的位置是否合法。

int

mycircularqueuefront

(mycircularqueue* obj)

return obj->_data[obj->_front]

;}

取隊頭元素時要注意符合題目要求,若隊列為空返回-1。

int

mycircularqueuerear

(mycircularqueue* obj)

if(obj->_rear ==0)

return obj->_data[obj->_rear -1]

;}

取隊尾元素的時候還要額外注意隊尾位於0位置的特殊情況。此情況下,不能直接取obj->_data[obj->_rear - 1],因為我們保留了乙個空白位置,不儲存任何資料,這樣就無法取到正確的值。因此,取obj->_data[obj->_k]即可。

力扣第622題 設計迴圈佇列

設計你的迴圈佇列實現。迴圈佇列是一種線性資料結構,其操作表現基於 fifo 先進先出 原則並且隊尾被連線在隊首之後以形成乙個迴圈。它也被稱為 環形緩衝器 迴圈佇列的乙個好處是我們可以利用這個佇列之前用過的空間。在乙個普通佇列裡,一旦乙個佇列滿了,我們就不能插入下乙個元素,即使在佇列前面仍有空間。但是...

力扣 設計迴圈佇列

設計你的迴圈佇列實現。迴圈佇列是一種線性資料結構,其操作表現基於 fifo 先進先出 原則並且隊尾被連線在隊首之後以形成乙個迴圈。它也被稱為 環形緩衝器 迴圈佇列的乙個好處是我們可以利用這個佇列之前用過的空間。在乙個普通佇列裡,一旦乙個佇列滿了,我們就不能插入下乙個元素,即使在佇列前面仍有空間。但是...

迴圈佇列 622 設計迴圈佇列

設計你的迴圈佇列實現。迴圈佇列是一種線性資料結構,其操作表現基於fifo 先進先出 原則並且隊尾被連線在隊首之後以形成乙個迴圈。它也被稱為環形緩衝器。迴圈佇列的乙個好處是我們可以利用這個佇列之前用過的空間。在乙個普通佇列裡,一旦乙個佇列滿了,我們就不能插入下乙個元素,即使在佇列前面仍有空間。但是使用...