408考研筆記之資料結構 五 佇列

2021-10-04 23:31:04 字數 2162 閱讀 3238

本文僅為學習筆記,如有錯誤與不足還請指正。

#define maxsize 50      

//定義佇列中元素的最大個數

typedef

struct

sqqueue;

初始狀態(隊空條件):q.front = =q.rear = = 0。

進隊操作:隊不滿時,先送值到隊尾元素,再將隊尾指標加1。

出隊操作:隊不空時,先取隊頭元素值,再將隊頭指標加1。

**實現如下:

//入隊操作

bool enqueue

(sqqueue &q,elemtyoe x)

//出隊操作

bool dequeue

(sqqueue &q,elemtype &x)

//獲得隊頭元素的值

bool gethead

(sqqueue q,elemtype qx)

但順序實現會存在缺點,q.front = = q.rear = = 0成立為隊空,但卻無法將q.rear==maxsize作為空滿條件,因為如果就只有乙個元素在隊尾,這時佇列明明沒有滿,卻造成了佇列的「上溢位」,這種溢位並不是真正的溢位,因為佇列中還存在空位置。所以我們引入了迴圈佇列。

迴圈佇列就是把儲存佇列元素的表從邏輯上視為乙個環。

初始時,q.rear = = q.front = = 0

隊首指標進1:q.front=(q.front+1)%maxsize

隊尾指標進1:q.rear=(q.rear+1)%maxsize

佇列長度:(q.rear+maxsize-q.front)%maxsize

按常規的方法判斷的話,隊空條件為q.front = = q.rear,如果模擬一遍出隊與入隊,會發現,此時隊滿條件也為q.frot==q.rear。對於這個問題有以下三種解決辦法。

犧牲乙個儲存單元來區分隊空和隊滿。

隊空條件:q.front==q.rear

隊滿條件:(q.rear+1)%maxsize = = q.front

佇列中元素個數:(q.rear-q.front+maxsize)%maxsize。

型別中增加表示元素個數的資料成員。

這樣,隊空的條件為q.size= =0

隊滿:q.size= =maxsize

型別中增加tag資料成員,以區分隊滿還是隊空。tag等於0,且因刪除導致q.front= =q.rear,則為隊空。若tag等於1,若因插入導致q.front==q.rear,則為隊滿。

佇列的基本操作

//初始化

void

initqueue

(sqqueue &q)

//判隊空

bool isempty

(sqqueue q)

//入隊

bool enqueue

(sqqueue &q,elemtype x)

//出隊

bool dequeue

(sqqueue &q,elemtype x)

//定義

typedef

struct

linknode;

typedef

struct

linkqueue;

//初始化

void

initqueue

(linkqueue &q)

//判隊空

bool isempty

(linkqueue q)

//入隊

void

enqueue

(linkqueue &q,elemtype x)

//出隊

bool dequeue

(linknode &q,elemtype &x)

資料結構 五 佇列

佇列是一種操作受限的線性表,它只能在表的一端插入,在另一端刪除。特點是先進先出 fifo 其儲存方式有順序儲存和鏈式儲存。順序佇列 順序佇列會出現假溢位現象。如圖。雖然陣列前面還有空間,但是由於rear已經指向了陣列的最後,佇列無法再入隊,形成了假溢位。解決的辦法是使用迴圈佇列。判斷隊空 bool ...

大話資料結構筆記4 2佇列

佇列是只允許在一端進行插入操作,另一端進行刪除操作的線性表,佇列是一種先進先出 first in first out 的線性表,簡稱fifo。允許插入的一端為隊尾,允許刪除的一端稱為隊頭。抽象資料型別 對於長度為n的佇列,順序儲存則需要建立 大於n的陣列,佇列元素儲存在陣列前n個元素 此時 入隊操作...

資料結構5 佇列

5.1簡介 佇列 queue 和堆疊一樣是一種有序鍊錶,屬於抽象資料型別。不同在於是先進先出 first in,first out,fifo 堆疊只需要乙個top指標指向堆疊頂端即可,但是佇列必須使用front和rear兩個指標分別指向佇列的前端和尾端。基本操作 1 create 建立空佇列 2 a...