資料結構模板之七 環形隊

2021-08-20 23:19:12 字數 1467 閱讀 6971

相比順序隊,環形隊不會出現假溢位的現象(由於每次進隊操作時隊尾指標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...