相比順序隊,環形隊不會出現假溢位的現象(由於每次進隊操作時隊尾指標rear增1,而每次出隊時頭指標front也是增1,順序隊中的front與rear一直在逼近maxsize,當rear=maxsize-1時,此時「隊滿」,無法再進隊,但實際上佇列裡仍然有空位置)。
若把存放資料的陣列「首尾相連」,將它視作一「環形陣列」,假溢位的現象就能解決。
環形隊充分地利用了空間,但它也有缺陷,由於隊空和隊滿的條件一樣(q->front = q->rear),無法只通過這兩個指標的當前位置區分隊空和隊滿(下面解決);多次的進隊和出隊操作,出隊元素的空間可能會被新進隊的元素覆蓋。
可以將環形隊理解成乙個首尾相連的順序隊,和順序隊不同,環形隊的隊首和隊尾指標初始化時都置為0,隊尾和隊首指標採用求餘的方式增1(eg:front = (front+1)% maxsize)。
1.犧牲乙個元素空間(下文中採取的便是這種方式)
當q->rear+1)% maxsize == q->front時,隊滿上溢位。
當q->front = q->rear時,隊空下溢位。
2.新增乙個計數變數count實時統計隊中數量
將count初始化為0,count為0時,不允許出隊,隊空;count為maxsize時,不允許入隊,隊滿。
未引入計數變數求佇列中個數的方法:n(個數) = (rear - front + maxsize)% maxsize。
3.新增乙個變數flag
初始時flag為0,入隊成功時flag = 1,出隊成功時flag = 0。
q->front = q->rear && flag == 0,隊空。
q->front = q->rear && flag == 1,隊滿。
#include #include using namespace std;
#define maxsize 50
typedef int elemtype;
typedef struct
sqqueue; //環形隊型別
/*****初始化佇列*****/
void initqueue(sqqueue * &q)
/*****銷毀佇列*****/
void destroyqueue(sqqueue * &q)
/*****判斷佇列是否為空*****/
bool queueempty(sqqueue *q)
/*****進佇列*****/
bool enqueue(sqqueue * &q,elemtype e)
/*****出佇列*****/
bool dequeue(sqqueue * &q,elemtype &e)
int main()
---**和部分內容參考自《資料結構教程》 資料結構模板之六 順序隊
佇列是一種操作受限的線性表,和棧的一端不允許操作不同,佇列的兩端都可進行操作,而且只能是一端進 插入操作 另一端出 刪除操作 進行插入操作的一端稱為隊尾,進行刪除操作的一端稱為隊首或隊頭。新元素 進隊後便成為新的隊尾元素 棧的新元素進入則是棧頂元素 元素 出隊後,其後繼元素成為新的隊首元素。所以,佇...
資料結構之鍊錶 141 環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳遞,僅僅是為了標識...
資料結構模板 棧
此部落格是存的是我自己編寫的棧模板,如有錯誤請指出棧是操作受限的線性表,只允許在棧頂進行插入和刪除操作,遵循 後進先出 原則。include include define elemtype int define maxsize 1000 using namespace std 這是順序棧的模板 ty...