資料結構 C 實現之佇列結構

2021-10-04 20:44:08 字數 2272 閱讀 7825

佇列本質上是特殊的線性表,它是在一端(隊頭)進行刪除操作,另一端(隊尾)進行插入操作,遵守先進先出規則(fifo)。既然佇列也是線性表,當然也有兩種資料儲存方式:順序儲存結構,這種結構事先要基本確定佇列的大小,不支援動態分配儲存空間,所以插入和刪除元素比較省時,但是會造成空間的浪費。 為了節省空間,後來學者提出了迴圈佇列鏈式儲存結構,可以不需要事先知道佇列的大小,支援動態和釋放空間,但是插入和刪除操作比較耗時,也稱鏈佇列。其中有迴圈佇列也可分為兩種:順序儲存結構迴圈佇列 、鏈式結構迴圈佇列。【鍊錶優勢:空間無限理論上】

2.1 抽象資料型別

initqueue(*q); //初始化乙個空佇列

destroyqueue(*q); //佇列存在,則銷毀

clearqueue(*q); //將佇列清空

queueempty(q); //隊列為空,返回true or flase

gethead(q,*e); //佇列存在且非空,返回佇列的頭元素

insertqueue(*q,e); //佇列存在,插入元素e到q中並成為隊尾元素

deletequeue(*q,*e); //刪除佇列頭元素,並以e返回

queuelength(q); //返回佇列的元素個數

*///佇列的順序儲存結構與線性表順序結構相同

struct queue

;2.2 初始化、插入以及刪除操作1)初始化就是開闢空間,清理記憶體以及更新長度

2)插入佇列的插入只能是從尾端進行,時間複雜度為o(1)

3)刪除操作時只能在佇列頭部進行,後面所有資料要向前移動,時間複雜度o(n)

//初始化佇列

void qq::

initqueue

(queue &q)

//插入資料佇列

qq::status qq::

insertqueue

(queue &q, elemtype e)

//刪除資料佇列

qq::status qq::

deletequeue

(queue &q, elemtype &e)

4.1 抽象資料型別

//佇列的順序儲存結構與線性表順序結構相同

1) 這裡就存在乙個問題:怎麼判斷迴圈佇列是滿了的?**方法1:**設定乙個標誌flage,當 front = rear時且flage=0,隊列為空;噹噹 front = rear時且flage=1,隊列為滿。

**方法2:**當front = rear時為空,佇列滿時,我們修改其條件保留乙個空間。也就是,佇列滿時佇列還有一空閒空間。

4.2 初始化、插入以及刪除操作

1)佇列滿時條件判斷:(rear+1)%queuesize==front,其中queuesize指佇列的最大尺寸

2)佇列元素長度:(rear-front+queuesize)%queuesize

//初始化迴圈順序結構佇列

void rqq::

initqueue

(rqueue &q)

//返回迴圈佇列長度

int rqq::

queuelength

(rqueue q)

//插入元素到迴圈佇列rear

rqq::status rqq::

insertqueue

(rqueue &q, elemtype e)

//刪除迴圈佇列元素front

資料結構之佇列 C 實現

佇列很重要的一點就是入隊在隊尾進行,出隊在隊首進行,所以又把佇列稱為先進先出表。功能實現 1.入隊功能 使用鍊錶實現 include iostream using namespace std typedef struct studentnode typedef struct linkqueue qu...

資料結構 佇列之C陣列實現

佇列 是一種限定操作的線性表,它只能在表的 一段插入,另外一段取出 所以也稱為 先進先出 資料結構 fifo first in first out c 如下 有小bug不想調了,作為參考即可 include define maxsize 5 typedef int elemtype typedef ...

資料結構 c佇列實現

使用雙向鍊錶 include 佇列結點的結構 typedef struct qnodeqnode 佇列 typedef struct queue queue 初始化,注意這裡使用一級指標 void initqueue queue q 入隊 void enqueue queue q,int val 設...