本文僅為學習筆記,如有錯誤與不足還請指正。
#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...