資料結構之佇列

2021-07-23 17:49:14 字數 2116 閱讀 9891

佇列的基本概念

佇列(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.佇列的示意圖 佇列中...