佇列的基本概念
佇列(queue):也是運算受限的線性表。是一種先進先出(first in first out ,簡稱fifo)的線性表。只允許在表的一端進行插入,而在另一端進行刪除。
隊首(front) :允許進行刪除的一端稱為隊首。
隊尾(rear) :允許進行插入的一端稱為隊尾。
佇列中沒有元素時稱為空佇列。在空佇列中依次加入元素a1, a2, …, an之後,a1是隊首元素,an是隊尾元素。顯然退出佇列的次序也只能是a1, a2, …, an ,即佇列的修改是依先進先出的原則進行的。
佇列的抽象資料型別定義
adt queue
資料關係:r =
約定a1端為隊首,an端為隊尾。
基本操作:
create():建立乙個空佇列;
emptyque():若隊列為空,則返回true ,否則返回flase ;
⋯⋯insertque(x) :向隊尾插入元素x;
deleteque(x) :刪除隊首元素x;
} adt queue
佇列的順序表示和實現:
利用一組連續的儲存單元(一維陣列) 依次存放從隊首到隊尾的各個元素,稱為順序佇列。
對於佇列,和順序棧相類似,也有動態和靜態之分。以下是靜態順序佇列,其型別定義如下:
#define max_queue_size 100
typedef struct queue
sqqueue;
佇列的順序儲存結構:
設立乙個隊首指標front ,乙個隊尾指標rear ,分別指向隊首和隊尾元素。
◆ 初始化:front=rear=0。
◆ 入隊:將新元素插入rear所指的位置,然後rear加1。
◆ 出隊:刪去front所指的元素,然後加1並返回被刪元素。
◆ 隊列為空:front=rear。
◆ 隊滿:rear=max_queue_size-1或front=rear。
在非空佇列裡,隊首指標始終指向隊頭元素,而隊尾指標始終指向隊尾元素的下一位置。
順序佇列中存在「假溢位」現象。因為在入隊和出隊操作中,頭、尾指標只增加不減小,致使被刪除元素的空間永遠無法重新利用。因此,儘管佇列中實際元素個數可能遠遠小於陣列大小,但可能由於尾指標巳超出向量空間的上界而不能做入隊操作。該現象稱為假溢位。如圖3-6所示是陣列大小為5的順序佇列中隊首、隊尾指標和佇列中元素的變化情況。
迴圈佇列:
為充分利用向量空間,克服上述「假溢位」現象的方法是:將為佇列分配的向量空間看成為乙個首尾相接的圓環,並稱這種隊列為迴圈佇列(circular queue)。
在迴圈佇列中進行出隊、入隊操作時,隊首、隊尾指標仍要加1,朝前移動。只不過當隊首、隊尾指標指向向量上界(max_queue_size-1)時,其加1操作的結果是指向向量的下界0。
這種迴圈意義下的加1操作可以描述為:
if (i+1==max_queue_size) i=0;
else i++ ;
其中: i代表隊首指標(front)或隊尾指標(rear)
用模運算可簡化為:i=(i+1)%max_queue_size ;
顯然,為迴圈佇列所分配的空間可以被充分利用,除非向量空間真的被佇列元素全部占用,否則不會上溢。因此,真正實用的順序佇列是迴圈佇列。
入隊時尾指標向前追趕頭指標,出隊時頭指標向前追趕尾指標,故隊空和隊滿時頭尾指標均相等。因此,無法通過front=rear來判斷佇列「空」還是「滿」。解決此問題的方法是:約定入隊前,測試尾指標在迴圈意義下加1後是否等於頭指標,若相等則認為隊滿。即:
◆ rear所指的單元始終為空。
◆ 迴圈隊列為空:front=rear 。
◆ 迴圈佇列滿:(rear+1)%max_queue_size =front。
迴圈佇列的基本操作
1 迴圈佇列的初始化
sqqueue init_cirqueue(void)
:入隊操作
status insert_cirqueue(sqqueue q , elemtype e)
/* 將資料元素e插入到迴圈佇列q的隊尾 */
出隊操作
status delete_cirqueue(sqqueue q, elemtype *x )
/* 將迴圈佇列q的隊首元素出隊 */
資料結構之佇列
八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...
資料結構之佇列
與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元 素。在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。1 鏈佇列 佇列的鏈式表示和實現 用鍊錶表示的佇列簡稱為鏈佇列,乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標 分別稱為頭指 針和尾指標 才能唯一確定。這裡...
資料結構之佇列
一 佇列的介紹 佇列 queue 是一種線性儲存結構。它有以下幾個特點 1 佇列中資料是按照 先進先出 fifo,first in first out 方式進出佇列的。2 佇列只允許在 隊首 進行刪除操作,而在 隊尾 進行插入操作。佇列通常包括的兩種操作 入佇列 和 出佇列。1.佇列的示意圖 佇列中...