演算法基礎 迴圈佇列

2021-07-09 18:43:50 字數 2221 閱讀 5441

迴圈佇列是一種先進先出的,首尾相連的佇列。

大致的結構如下圖:

用陣列來抽象的表示一下的話,如下圖:

迴圈佇列有兩個指標指向資料,上圖中的start和end就是那兩個指標,它們指向相同的位置,表示的是空,即佇列是空的。

隨著資料的放入,佇列一般有下面的兩種形式:

需要注意第二種形式,從圖上看end在start的前面了,但是因為迴圈關係,前後並不重要。

另外需要考慮的是佇列滿的情況:

但這種情況存在乙個問題,即空佇列和滿佇列沒有辦法區分了,end和start都指向了相同的位置。

為了解決這個問題,乙個方法是空出乙個位置不放資料,當end再加乙個資料就等於start的時候就認為佇列是滿的:

這時實際的資料長度就會比分配的少1。

下面是佇列中空和滿的判斷:

1. 隊列為空時:end == start

2. 隊列為滿時:(end + 1) % size == start

這裡的size是指分配的空間大小,而不是佇列長度,佇列的實際長度為(end - start + size) % size,最大長度是size-1

這也是因為要考慮迴圈的關係,所以要加上%size這個操作。

下面是示例**:

1. 首先定義結構體:

//定義迴圈佇列

typedef struct _loopqueue loopqueue;

2. 定義各種演算法:

#define true	1

#define false 0

#define size 8

//初始化佇列

int init(loopqueue *lq)

//判斷佇列是否為空

int isempty(loopqueue *lq)

return false;

}//判斷佇列是否為滿

int isfull(loopqueue *lq)

return false;

}//獲取佇列的長度

int getlength(loopqueue *lq)

//插入資料

int pushqueue(loopqueue *lq, int data)

lq->data[lq->end] = data;

lq->end = (lq->end + 1) % size;

return true;

}//彈出資料

int popqueue(loopqueue *lq, int *data)

*data = lq->data[lq->start];

lq->start = (lq->start + 1) % size;

return true;

}//顯示佇列中的資料

void printqueue(loopqueue *lq)

for (index = 0; index < count; index++)

printf("\n");

return;

}

3. 測試:

int main()

printqueue(lq);

for (index = 0; index < size; index ++)

} printqueue(lq);

return 0;

}

4. 最後的結果:

佇列 迴圈佇列

迴圈佇列是乙個大小確定的特殊佇列,它的特殊體現在迴圈,之前提到的普通佇列,我們是用鍊錶來實現的,在這裡,由於迴圈佇列是乙個長度確定的佇列,所以我們可以拿順序表來實現。迴圈佇列的操作與普通佇列類似,不過不同的地方在於當rear走到capacity 1並且front在0號元素位置的時候,當此時再有元素入...

小白演算法積累 佇列1 迴圈佇列 tag

題目 若希望迴圈佇列中的元素都能得到利用,則需設定乙個標誌域tag,並以tag的值為0或1來區分隊頭指標front和隊尾指標rear相同時的佇列狀態是 空 還是 滿 試編寫與此結構相應的入隊和出隊演算法。關鍵字 迴圈佇列 tag的使用 思路 迴圈佇列 需要變數 隊頭指標front,隊尾指標rear,...

資料結構與演算法 佇列 迴圈佇列

部分內容來自於 資料結構 c語言版 清華大學出版社,嚴蔚敏 吳偉民 編著 如果我們將佇列設定為順序儲存結構,那麼,因為出隊的時候是從隊首出隊,入隊的時候是從隊尾入隊,而入隊需要在後面的記憶體中開闢空間,一直這樣總會把所有的記憶體耗盡.雖然我們在出隊的時候會釋放空間,但是釋放的空間是在靠前的記憶體位址...