佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。
在佇列這種資料結構中,最先插入的元素將是最先被刪除的元素;反之最後插入的元素將是最後被刪除的元素,因此佇列又稱為“先進先出”(FIFO—first in first out)的線性表。
佇列空的條件:front=rear
佇列滿的條件: rear = MAXSIZE
佇列的陣列實現
佇列可以用陣列Q[1…m]來儲存,陣列的上界m即是佇列所容許的最大容量。在佇列的運算中需設兩個指標:head,隊 頭指標,指向實際隊頭元素的前一個位置;tail,隊尾指標,指向實際隊尾元素所在的位置。一般情況下,兩個指標的初值設為0,這時佇列為空,沒有元素。 陣列定義Q[1…10]。Q(i) i=3,4,5,6,7,8頭指標head=2,尾指標tail=8。佇列中擁有的元素個數為:L=tail-head現要讓排頭的元素出隊,則需將頭指 針加1。即head=head+1這時頭指標向上移動一個位置,指向Q(3),表示Q(3)已出隊。如果想讓一個新元素入隊,則需尾指標向上移動一個位 置。即tail=tail+1這時Q(9)入隊。當隊尾已經處理在最上面時,即tail=10,如果還要執行入隊操作,則要發生"上溢",但實際上佇列中 還有三個空位置,所以這種溢位稱為"假溢位"。
克服假溢位的方法有兩種。一種是將佇列中的所有元素均向低地址區移動,顯然這種方法是很浪費時間的;另一種方法是將陣列儲存區看成是一個首尾相接的環形區域。當存放到n地址後,下一個地址就"翻轉"為1。在結構上採用這種技巧來儲存的佇列稱為迴圈佇列。
佇列和棧一樣只允許在斷點處插入和刪除元素。
迴圈隊的入隊演算法如下:
1、tail=tail+1;
2、若tail=n+1,則tail=1;
3、若head=tail尾指標與頭指標重合了,表示元素已裝滿佇列,則作上溢位錯處理;
4、否則,Q(tail)=X,結束(X為新入出元素)。
佇列和棧一樣,有著非常廣泛的應用。
注意:(1)有時候佇列中還會設定表頭結點,就是在對頭的前面還有一個結點,這個結點的資料域為空,但是指標域指向對頭元素。
(2)另外,上面的計算還可以利用下面給出的公式cq.rear=(cq.front+1)/max;
當有表頭結點時,公式變為cq.rear=(cq.front+1)/(max+1)。
佇列的連結串列實現
在佇列的形成過程中,可以利用線性連結串列的原理,來生成一個佇列。
基於連結串列的佇列,要動態建立和刪除節點,效率較低,但是可以動態增長。
佇列採用的FIFO(first in first out),新元素(等待進入佇列的元素)總是被插入到連結串列的尾部,而讀取的時候總是從連結串列的頭部開始讀取。每次讀取一個元素,釋放一個元素。所謂的動態創 建,動態釋放。因而也不存在溢位等問題。由於連結串列由結構體間接而成,遍歷也方便。
佇列的基本運算
(1)初始化佇列 Qini (Q)
(2)入隊 QADD(Q,X) (3)出隊 QDel(Q,X)
(4)判斷佇列是否為空 qempty(Q)
(5)判斷佇列是否為滿qfull(Q)
操作
|
型別
|
作用
|
返回值
|
例子
|
length(s)
|
函式
|
求字串s的長度
|
整型
|
s:='123456789';
l:=length(s);{l的值為9}
|
copy(s,w,k)
|
函式
|
複製s中從w開始的k位
|
字串
|
s:='123456789';
s1:=copy(s,3,5);{s1的值是'34567'}
|
val(s,k,code)
|
過程
|
將字串s轉為數值,存在k中;code是錯誤程式碼
|
|
var s:string;k,code:integer;
begin
s:='1234';
val(s,k,code);
write(k);{k=1234}
|
str(i,s)
|
過程
|
將數值i轉為字串s
|
|
i:=1234;
str(i,s);
write(s);{s='1234'}
|
Delete(s,w,k)
|
過程
|
在s中刪除從第w位開始的k個字元
|
|
s := 'Honest Abe Lincoln';
Delete(s,8,4);
Writeln(s); { 'Honest Lincoln' }
|
Insert(s1, S, w)
|
過程
|
將s1插到s中第w位
|
|
S := 'Honest Lincoln';
Insert('Abe ', S, 8); { 'Honest Abe Lincoln' }
|
Pos(c, S)
|
函式
|
求字元c在s中的位置
|
整型
|
S := ' 123.5';
i :=Pos(' ', S);{i的值為1}
|
+
|
運算子
|
將兩個字串連線起來
|
|
s1:='1234';
s2:='5678';
s:=s1+s2;{'12345678'}
|
在STL中,對佇列的使用很是較完美
Data_structures
▪ 集合
|
▪ 容器
|
|
|
|
|
|
|
▪ 陣列
|
▪ 關聯陣列
|
▪ Multimap
|
▪ 集
|
▪ 多重集
|
▪ 雜湊表
|
▪ 樹狀陣列
|
|
|
|
|
|
▪ 列表
|
▪ 連結串列
|
▪ 佇列
|
▪ 堆疊
|
▪ 迴圈佇列
|
▪ 跳躍列表
|
|
|
|
|
|
|
▪ 樹
|
▪ 二叉查詢樹
|
▪ 堆
|
▪ 線段樹
|
▪ 紅黑樹
|
▪ AVL樹
|
|
|
|
|
|
|
▪ 圖
|
▪ 有向無環圖
|
▪ 二元決策圖
|
▪ 無向圖
|
|
|
|
|
擴充套件閱讀: