前一篇 堆疊的順序儲存和鏈式儲存
多個資料組成乙個有序序列,只能在一端插入,在另一端刪除,這樣的資料組織方式就叫做佇列。又被稱為"先進先出表"(fifo)。
順序儲存:
首先來看用陣列實現,分別用兩個變數front和rear來表示佇列的頭和尾,一開始都初始化為-1。當有元素入隊時(插入陣列尾中)rear向陣列尾移動一。當有元素出隊時,front向右移動一,然後將元素移除。
當陣列固定了大小的時候,隨著元素的新增和刪除,當rear到達陣列的末端時,無法再新增元素,但是front不在陣列頭,前面還有很多位置,這就造成了假溢位現象,所以我們一般把佇列(陣列)的頭尾相連,組成迴圈佇列,這樣就可以避免這樣的情況出現。
如何判定隊列為空呢?front等於rear;
如何判定佇列滿了呢?rear(新增乙個元素)往後移動一到了front的位置,此時是佇列滿的狀態,但是這和佇列空的判定衝突了。
這是為什麼呢?因為我們是用front和rear兩者之間的位置來表示佇列的狀態的,這兩者之間的位置差距只有n(陣列的大小)種情況,但是佇列的狀態有n+1中(0,1,2...n)。
所以我們有兩種方法:
一是多加乙個變數,記錄當前佇列中元素個數,或者是最後一次操作,依次來區分佇列空和滿的狀態。
二是少用乙個位置,當rear+1 == front時,我們就把其看成佇列已滿。
下面用第二個方式來實現乙個迴圈佇列:
用rear+1 取餘 陣列長度n 來給rear賦值
//佇列的線性儲存
typedef int elementtype;
typedef struct qnode * queue;
typedef int positions;
struct qnode;
初始化:
queue makequeue(int maxsize)
入隊:
//入隊
bool addq(queue q, elementtype x)else
}
出隊:
//出隊
elementtype deleteq(queue q)else
}
鏈式儲存:因為單鏈表的表頭插入和刪除都很方便,而表尾的插入方便但是刪除不好找其前驅節點,因此我們讓佇列的頭(front)指向鍊錶的表頭,佇列尾指向鍊錶尾(rear)。
//單鏈表節點
typedef struct node * ptonode;
struct node ;
typedef ptonode position;
//佇列
初始化:
lqueue makelqueue(int maxsize)
入隊:
//入隊
bool addlq(lqueue lq, elementtype x)else
if (length == lq->maxsize)else
}}
出隊:
elementtype deletelq(lqueue lq)elseelse
free(p);
return temp;}}
佇列的順序儲存結構和鏈式儲存結構
佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表 在隊尾進行插入操作,在對頭進行刪除操作 與棧相反,佇列是一種 先進先出 first in first out,fifo 的線性表。與棧相同的是,佇列也是一種重要的線性結構,實現乙個佇列同樣需要順序表或鍊錶作為基礎。佇列既可...
鍊錶的順序儲存和鏈式儲存的區別
順序儲存就是順序表 鏈式儲存就是鍊錶 基於空間的比較 1.儲存分配方式 順序表的儲存空間是一次性分配的,且是連續的儲存空間 鍊錶的儲存空間是多次分配的,不需要是連續的 2.儲存密度 儲存密度 結點值域所佔的儲存量 結點結構所佔的儲存空間的總量 順序表的儲存密度 1,鍊錶的儲存密度小於1 結點中包含指...
佇列的順序 鏈式儲存實現
佇列 具有一定操作約束的線性表,只能在一端插入,在另一端刪除。特點 先來先服務,先進先出表 頭front,尾rear 順序儲存 1 define maxsize 儲存資料元素的最大個數 23 struct qnode 1213 typedef struct qnode queue 14 front ...