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 順序佇列的初始化 順序佇列的初始化 ...