佇列(queue)是一種運算受限的線性表,僅允許在表的一端進行插入,而在表的另一端進行刪除。進行插入的一端叫做隊尾,進行刪除的一端叫做隊頭。
佇列的操作:
向佇列中插入新元素稱為進隊或入隊,新元素進隊後就成為新的隊尾元素
從佇列中刪除元素稱為出隊或離隊,元素出隊後,其後繼元素就成為隊首元素
從佇列的基本概念和操作來看,佇列是一種具有先進先出特點的資料結構。
假設佇列中有n個元素,其中a1是隊頭元素,an為隊尾元素,那麼在刪除元素時就可以從a1開始,在插入新元素時就可以從an後面進行插入。
adt queue
//elemtype為型別識別符號
資料關係:
r =
資料操作:
initqueue(&q):初始化佇列。構造乙個空佇列q。
destroyqueue(&q):銷毀佇列。釋放佇列q占用的儲存空間。
queueempty(q):判斷佇列是否為空。若佇列q為空,則返回真;否則返回假。
enqueue(&q,e):進佇列。將元素e進隊作為隊尾元素。
dequeue(&q,&e):出佇列。從佇列q中出隊乙個元素,並將其值賦給e。
}
對於佇列的順序儲存結構來說,佇列中的資料元素data都是具有同一資料型別(elemtype),通過maxsize我們可以確定佇列的儲存空間,可以利用順序儲存結構把這些資料元素data儲存下來,當操作佇列時同時還需要關注隊首(front)和隊尾(rear)。
定義佇列的儲存結構:
typedef
struct
sqqueue;
在佇列的四要素中,rear指向隊尾元素,front指向隊頭元素的前乙個位置:
1. 當初始化乙個佇列的時候,佇列中的隊首(front)和隊尾(rear)應該指向-1,表示還沒有指向有效位置
2. 當資料元素a,b,c,d按次序入隊時,每次資料元素入隊都是從隊尾(rear)開始的,所以隊尾(rear)的指向一直在增加,由於沒有資料元素出隊,隊首(front)的指向還是-1。
3. 當資料元素出隊時,總是在隊首進行的,當資料元素a要出隊時,隊首(front)就應該指向資料元素a的位置。
4. 當佇列中的所有資料元素都出隊時,隊首(front)會指向最後乙個資料元素d的位置,此時隊首和隊尾的位置相同,隊列為空。
佇列四要素總結:
隊空條件:front == rear
隊滿條件:rear == maxsize-1
元素e進隊:rear++ ; data[rear] == e
元素e出隊:front++ ; e == data[front];
1.初始化佇列initqueue(q)
建立乙個空佇列q,將front和rear指標均初始化為-1值
2.銷毀佇列destroyqueue(q)
釋放佇列q占用的儲存空間
void destroyqueue(sqqueue *&q)
3.佇列是否為空queueempty(q)
若佇列q滿足q->front==q->rear條件,則說明隊列為空,否則不為空
4.入佇列enqueue(q,e)
在進行入隊操作時,應該先判斷佇列是否已滿。如果佇列不滿則將隊尾(rear)+1,然後將元素入隊
5.出佇列dequeue(q,e)
在進行出隊操作時,也應該先判斷佇列是否已滿,如果佇列不滿則將隊首(front)+1,將該位置的元素值賦給e
假設這麼一種情況,佇列的儲存空間可以儲存5個資料元素,在開始時,一直往佇列中加入元素a,b,c,d,e,當佇列滿時,rear指向下標為4的位置,此時佇列無法再加入新的元素。
當佇列滿時,就一直將佇列中的元素全部出隊,當最後乙個元素e出隊時,佇列就為空,隊首(front)也會指向下標為4的位置。
此時就會造成隊尾(rear)和隊首(front)指向同一位置,由於隊首(front)指向了佇列的末尾,說明隊列為空,但是由於隊尾(rear)也指向了佇列的末尾,就會造成一種「佇列已滿」的假象
,但事實上並非如此,因此這將會造成佇列空間的浪費。也就是說順序佇列可能會出現「佇列已滿」的假象,導致儲存空間不足。
順序迴圈佇列的基本操作
名稱 順序迴圈佇列的基本操作 說明 此處說明以下有關順序迴圈佇列的判斷空,判斷滿的問題。此處採用的是少用乙個儲存元素。此外,還可以採用增加乙個標誌位tag,即指示fro rear是因為空還是因為滿。還有可以增加乙個q.size屬性來判斷是否達到空或者滿的狀態。順序佇列的儲存結構 typedef st...
順序佇列基本操作的實現
順序佇列和前面的順序表一樣,相當於乙個陣列,不同的是它的有效區間,當陣列走到最大時,又會從頭開始,這裡用head 和tail兩個下標來表示頭和尾,即當tail到達size時,tail又從0開始,head也是同樣的道理 如下 seqqueue.h pragma once define seqqueue...
佇列 順序儲存 基本操作
佇列是一種操作受限的線性表 佇列只允許在一端進行插入 即入隊 另一端進行刪除 即出隊 隊尾進,對頭出 first in first out fifo 初始化佇列,構造乙個空的佇列 void initqueue sqqueue q 判斷佇列是否為空 bool queueisempty sqqueue ...