c 佇列的基本操作 C語言佇列

2021-10-18 10:59:31 字數 1404 閱讀 5093

1、佇列是一種先進先出的線性表,只允許在隊尾進行插入,在隊首進行刪除。

initqueue()——初始化佇列

enqueue() ——進佇列

dequeue() ——出佇列

isqueueempty()——判斷佇列是否為空

isqueuefull() ——判斷佇列是否已滿

1)初始化佇列,一般令tail=0,head=0,如果佇列中含有其他元素,則給其賦初值。

2)進佇列,即在隊尾插入乙個元素。在進行插入之前必須判斷佇列是否為滿,之後隊尾指標加一。

phead->data[phead->tail] = item;

phead->tail = (phead->tail + 1) % queue_size;

3)出佇列,即從對列首部取出乙個元素。在進行出隊之前必須判斷佇列是否為空,之後隊首指標加一。出隊很容易讓人聯想到減法運算,但實際上head記錄的是移除佇列的元素個數,tail記錄的是入隊元素的個數,兩者之差代表的是佇列中實際存在的個數。

*item = phead->data[phead->head];

phead->head = (phead->head + 1) % queue_size;

4)佇列空。當入隊元素個數等於出隊元素個數的時候,即認為隊列為空。

phead->head == phead->tail;

5)佇列滿。當佇列中的元素個數達到佇列所能容納的最大值的時候,即可判斷隊列為滿。在迴圈佇列中我們通常會犧牲乙個元素,以區分佇列滿和空。比如有5個元素的迴圈佇列,我們通常只存放四個元素,當(tail+1)%queue_size等於head的時候即認為佇列滿。

6)佇列中的元素個數。

3、佇列的分類:迴圈佇列、單向佇列

4、迴圈佇列:

優點:可以充分利用向量空間,克服"假溢位"現象

佇列空滿的判斷方法:在迴圈佇列下,仍定義front=rear時為隊空,而判斷隊滿則用兩種辦法,一是用"犧牲乙個單元",即rear+1=front(準確記是(rear+1)%m=front,m是佇列容量)時為隊滿。

另一種解法是"設標記"方法,如設標記tag,tag等於0情況下,若刪除時導致front=rear為隊空;tag=1情況下,若因插入導致front=rear則為隊滿。

5、假溢位

系統作為佇列用的儲存區還沒有滿,但佇列卻發生了溢位,我們把這種現象稱為"假溢位"。

設順序儲存佇列用一維陣列q[m]表示,其中m為佇列中元素個數,佇列中元素在向量中的下標從0到m-1。

設隊頭指標為front,隊尾指標是rear,約定front指向隊頭元素的前一位置,rear指向隊尾元素。當front等於-1時隊空,rear等於m-1時為隊滿。由於佇列的性質("刪除"在隊頭而"插入"在隊尾),所以當隊尾指標rear等於m-1時,若front不等於-1,則佇列中仍有空閒單元,所以佇列並不是真滿。這時若再有入隊操作,會造成假"溢位"。

C語言 佇列基本操作

includetypedef struct datanode qnode typedef struct linkqueue linkqueue 建立乙個新佇列 linkqueue createlinkqueue 向佇列插入乙個結點 linkqueue insertnode linkqueue q,i...

C語言鏈佇列的基本操作

鏈佇列的初始化及入隊出隊操作,xp3 vc6.0 執行下通過。define overflow 2 define error 0 include typedef int qelemtype typedef struct qnode qnode,queueptr typedef struct linkq...

順序佇列的基本操作 C語言

順序佇列即用順序表實現的佇列,其操作簡便,但是會出現 假溢位 的現象,這是由於順序表的定義以及佇列的特點所共同決定的 具體實現 順序佇列的定義 定義乙個順序佇列 define queuesize 100 typedef struct squeue sequeue 順序佇列的初始化 順序佇列的初始化 ...