C語言版資料結構(從0開始) 4 佇列

2021-10-02 11:00:22 字數 3407 閱讀 8136

2.3迴圈佇列

3.鏈佇列

1.佇列的概念

和棧一樣,佇列(queue)也是一種運算受限的線性表。它只允許在表的一端進行插入,而在另一端進行刪除。允許刪除的一端稱為隊頭(front),允許插入的一端稱為隊尾(rear)。

佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為出隊。因為佇列只允許在一端插入,在另一端刪除,所以只有最早進入佇列的元素才能最先從佇列中刪除,故佇列又稱為先進先出(fifo—first in first out)線性表。

當佇列中沒有元素時稱為空佇列。在空佇列中依次加入元素a1,a2,…an之後,a1是隊頭元素,an是隊尾元素。顯然退出佇列的次序也只能是a1,a2,…an,也就是說佇列的修改是依先進先出的原則進行的。

2.順序佇列

2.1順序佇列的概念

順序佇列實際上是運算受限的順序表,和順序表一樣,順序佇列也是必須用乙個向量空間來存放當前佇列中的元素。

隊空:q.front = q.rear

隊滿:q.rear - q.front = maxsize(隊長)

入隊:新元素按 rear 指示位置加入,再將隊尾指標加一 ,即 q.rear = q.rear + 1

出隊:將 q.front 指示的元素取出,再將隊頭指標加一,即 q.front = q.front + 1。

2.2非迴圈佇列

建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,每次在隊尾插入乙個元素是,q.rear增1;每次在隊頭刪除乙個元素時,q.front增1。隨著插入和刪除操作的進行,佇列元素的個數不斷變化,佇列所佔的儲存空間也在為佇列結構所分配的連續空間中移動。

當 q.front=q.rear時,佇列中沒有任何元素,稱為空佇列。當rear增加到指向分配的連續空間之外時,佇列無法再插入新元素,但這時往往還有大量可用空間未被占用,這些空間是已經出隊的佇列元素曾經占用過得儲存單元(例如 d 圖中的 0 1 2 位置)。

非迴圈佇列中的溢位現象

2.3迴圈佇列

迴圈佇列的空滿判別

如圖,由於入隊時尾指標向前追趕頭指標,出隊時頭指標向前追趕尾指標,故隊空和隊滿時頭尾指標均相等。因此,我們無法通過 front=rear 來判斷佇列「空」還是「滿」。

解決此問題的方法至少有兩種:

迴圈佇列的基本運算

// 佇列的順序儲存結構(迴圈佇列)

#define max_qsize 5

// 最大佇列長度+1

typedef

struct

sqqueue;

// 構造乙個空佇列q

sqqueue*

q_init()

q->base =

(int*)

malloc

(max_qsize *

sizeof

(int))

;// 儲存分配失敗if(

!q->base)

q->front = q->rear =0;

return q;

}// 銷毀佇列q,q不再存在

void

q_destroy

(sqqueue *q)

// 將q清為空佇列

void

q_clear

(sqqueue *q)

// 若佇列q為空佇列,則返回1;否則返回-1

intq_empty

(sqqueue q)

// 返回q的元素個數,即佇列的長度

intq_length

(sqqueue q)

// 若佇列不空,則用e返回q的隊頭元素,並返回ok;否則返回error

intq_gethead

(sqqueue q,

int&e)

// 插入元素e為q的新的隊尾元素

intq_put

(sqqueue *q,

int e)

// 若佇列不空,則刪除q的隊頭元素,用e返回其值,並返回1;否則返回-1

intq_poll

(sqqueue *q,

int&e)

3.鏈佇列

3.1 鏈佇列的概念

佇列的鏈式儲存結構簡稱為鏈佇列,它是限制僅在表頭刪除和表尾插入的單鏈表。顯然僅有單鏈表的頭指標不便於在表尾做插入操作,為此再增加乙個尾指標,指向鍊錶的最後乙個結點。於是,乙個鏈佇列由頭指標和尾指標唯一確定。

3.2鏈佇列的基本運算

將鏈佇列的型別linkqueue定義為乙個結構型別

//將鏈佇列的型別linkqueue定義為乙個結構型別:

typedef

struct queuenode

queuenode;

typedef

struct

linkqueue;

構造乙個空佇列

判斷是否為空

int

queueempty

(linkqueue q)

入隊操作

出隊操作

文章內容**於博主老師傳授、自身理解以及網路收集

C語言版資料結構 從0開始 3 棧

2.順序棧 3.鏈棧 4.棧的應用 例 對於乙個棧,給出輸入項a b c,如果輸入項序列由abc組成,試給出所有可能的輸出序列。2.1順序棧的概念 棧的順序儲存結構簡稱為順序棧,它是運算受限的順序表。因此,可用陣列來實現順序棧。因為棧底位置是固定不變的,所以可以將棧底位置設定在陣列的兩端的任何乙個端...

資料結構 C語言版 系列三 佇列

佇列是一種先進先出的線性表,它只允許在表的一端進行插入,而在另一端刪除元素。這和我們日常生活中的排隊是一致的,最早進入佇列的元素最早離開。在佇列中,允許插入的一端叫做隊尾 rear 允許刪除的一段則稱為隊頭 front 假設隊列為q a1,a2,an 則a1就是隊頭元素,an是隊尾元素。除了棧和佇列...

資料結構(C語言版) 佇列

1 佇列 在表的一端插入,表的另一端刪除,允許插入的一端為隊尾,允許刪除的一端為隊頭。先進先出fifo。2 佇列的基本操作 initqueue q 構造空佇列 destroyqueue q 銷毀佇列 clearqueue q 清空佇列 queueempty q 判斷佇列是否為空 queuelengt...