佇列的順序儲存 陣列 和鏈式儲存 鍊錶 C語言實現

2021-09-24 13:24:57 字數 1897 閱讀 3644

前一篇 堆疊的順序儲存和鏈式儲存

多個資料組成乙個有序序列,只能在一端插入,在另一端刪除,這樣的資料組織方式就叫做佇列。又被稱為"先進先出表"(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 ...