迴圈佇列是一種先進先出的,首尾相連的佇列。
大致的結構如下圖:
用陣列來抽象的表示一下的話,如下圖:
迴圈佇列有兩個指標指向資料,上圖中的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語言版 清華大學出版社,嚴蔚敏 吳偉民 編著 如果我們將佇列設定為順序儲存結構,那麼,因為出隊的時候是從隊首出隊,入隊的時候是從隊尾入隊,而入隊需要在後面的記憶體中開闢空間,一直這樣總會把所有的記憶體耗盡.雖然我們在出隊的時候會釋放空間,但是釋放的空間是在靠前的記憶體位址...