佇列(queue)的基本概念
佇列的影象模擬
佇列的基本操作:初始化佇列,判空,入隊,出隊,讀隊頭元素,清空佇列
順序儲存存在的問題:
如果用順序儲存結構,假設陣列最大值為maxsize,我們怎麼判斷隊空呢。我們可以利用用隊尾(rear)和隊頭(front)的相對位置來進行判斷,如果rear == front則說明隊空。同樣,求隊長的話就可以利用rear - front得出。可是求隊滿的時候卻不能利用rear == maxsize-1這種方法判斷。如下圖。
假設,a1-an依次入隊,再將a1出隊。此時,因為front是出隊點,如果佇列執行過出隊,就算rear == maxsize 此時成立,也不能說明隊滿了。那能不能利用rear - front == maxsize來判斷隊滿呢。仔細思考後發現,如圖,佇列執行過出隊後,front並不指向最開頭的位置。如果rear指向maxsize-1,此時是不算隊滿的,可陣列已經規定好了記憶體空間大小,如果此時執行入隊操作將會造成陣列越界。
我們可以把陣列在邏輯上看成乙個迴圈。
假設陣列長度為6,a1-a6依次入隊,再將a1出隊,效果如圖。
那麼,怎麼將陣列看成乙個迴圈呢,我們利用取餘運算來達到這一點,具體如下:
考慮清楚為什麼%maxsize
然而這又面臨乙個問題。如圖,如果再次進行入隊的話,此時隊滿,可是rear和front將會相等。這與判斷隊空的操作相沖,所以還要一些技巧來化解這個矛盾。具體如下:
以下為佇列的基本操作實現過程:
0. 準備
有寫東西都寫在注釋裡,多看注釋。
1. 初始化佇列#define elementtype int
//方便起見,元素型別用int,可以根據實際更改
typedef
struct queue
node;
//node為結構型別
typedef
struct
*ptr_que,flag_que;
//ptr_que 相當於 flag_que *
//函式宣告
ptr_que init_queue()
;bool is_empty
(ptr_que p)
;void
en_queue
(ptr_que p, elementtype e)
;bool de_queue
(ptr_que p)
;elementtype get_head
(ptr_que p)
;clear_queue
(ptr_que p)
;
雖然可以不用頭節點,但總感覺有頭節點更方便。使用malloc函式記得新增標頭檔案#include
2. 判空//初始化佇列
ptr_que init_queue()
判斷佇列是否為空。使用 bool型別記得新增標頭檔案#include
3. 入隊//判空
bool is_empty
(const ptr_que p)
入隊要從隊尾(rear)入。
4.出隊//入隊
void
en_queue
(ptr_que p,elementtype e)
我這裡設定了出隊的時候銷毀資料,讀者可以靈活變通。
5. 讀取隊頭資料//出隊
bool de_queue
(ptr_que p)
6. 清空佇列//讀取隊頭元素
elementtype get_head
(const ptr_que p)
因為我的出隊操作時銷毀資料,所以清空佇列時就很方便
//清空佇列
clear_queue
(ptr_que p)
C語言實現簡單的鍊錶佇列
使用c語言簡單實現鍊錶佇列的操作 include include include define size 4 節點 typedef struct snode snode 鍊錶佇列 typedef struct slistqueue qlist 初始化鍊錶佇列 intinitqlist qlist q...
陣列 鍊錶 佇列和棧 佇列,C語言實現
佇列,顧名思義就是很多個資料在排隊。既然是排隊,那就不能從最前面或者中間插進去,新來的資料只能排在隊伍的最後。另外,我們另外規定只有隊伍最前面的資料才能出去。當然,其實也只有隊伍最前面的資料能被外界檢視。能滿足這種功能的資料結構稱之為佇列。我們可以用陣列 鍊錶實現佇列。這裡用陣列實現簡單佇列。申請1...
C語言鍊錶實現佇列
課本上只給了佇列的陣列實現,關於鍊錶實現的留做了作業,現實現如下 queueli.h typedef int elementtype start fig3 57.txt ifndef queueli h define queueli h struct node struct qnode typede...