佇列是一種先進先出的線性表,它只允許在表的一端進行插入,而在另一端刪除元素。這和我們日常生活中的排隊是一致的,最早進入佇列的元素最早離開。在佇列中,允許插入的一端叫做隊尾(rear),允許刪除的一段則稱為隊頭(front)。假設隊列為q = (a1,a2,...an)則a1就是隊頭元素,an是隊尾元素。
除了棧和佇列之外,還有一種限定性資料結構是雙端佇列:限定插入和刪除操作在表的兩端進行的線性表。兩端分別稱為端點1和端點2,也可像棧一樣,可用乙個鐵道轉軌網路來比喻雙端佇列。在實際使用中,還可以有輸出首先的雙端佇列(即乙個端點允許插入和刪除,另乙個端點只允許插入的雙端佇列)和輸入首先的雙端佇列(即乙個端點允許插入和刪除,另乙個端點只允許刪除的雙端佇列)。而如果限定雙端佇列從某個端點插入的元素只能從該端點刪除,則該雙端佇列就蛻變為兩個棧底相鄰接的棧了。
儘管雙端佇列看起來似乎比棧和佇列更靈活,但實際上在應用程式中遠不及棧和佇列有用。
和線性表類似,佇列也有兩種儲存表示。
用鍊錶表示的佇列簡稱鏈佇列。乙個鏈佇列需要兩個分別指示隊頭和隊尾的指標,分別稱為頭指標和尾指標才能唯一確定。為方便起見也給鏈佇列新增乙個頭結點,並令頭指標指向頭結點。由此,空的鏈佇列的判決條件為頭指標和尾指標均指向頭結點。如圖所示
在初始化建空佇列時,約定front = rear = 0,每當插入新的佇列尾元素時,尾指標增1,每當刪除佇列頭元素時,頭指標增1。因此,在非空佇列中,頭指標始終指向佇列頭元素,而尾指標始終指向佇列尾元素的下乙個位置,如圖所示:
假設當前為佇列分配的最大空間為6,則當佇列處於d狀態時,不可在繼續插入新的隊尾元素,否則將導致陣列越界。然而此時又不宜如順序棧那樣,進行儲存再分配擴大陣列空間,因為佇列的實際可用空間並為佔滿。因此提出了迴圈佇列的概念。
如下圖所示,佇列頭元素是j3,佇列尾元素是j5,之後6、7、8插入,佇列空間佔滿,有q.front = q.rear,若3、4、5刪除,佇列空,同樣有q.front = q.rear。因此,只憑頭指標=尾指標無法判斷佇列是空還是滿,可有兩種處理方法:其一是另設乙個標誌位以區別佇列是空還是滿;其二是少用乙個元素空間,約定以佇列頭指標在佇列尾指標的下一位置(即環狀的下一位置)上作為佇列滿的標誌。在c語言中,不能用動態分配的一維陣列來實現迴圈佇列,如果使用者的應用程式中設有迴圈佇列,則必須為它設定乙個最大佇列長度,若使用者無法預估長度,則宜採用鏈佇列。
附:3-9-模擬銀行排隊過程-棧和佇列-第3章-《資料結構》課本原始碼-嚴蔚敏吳偉民版
C 資料結構與演算法系列(三) 佇列(Queue)
1.介紹 佇列是乙個有序列表,可以用陣列或是鍊錶來實現。遵循先入先出的原則,即 先存入佇列的資料,要先取出。後存入的要後取出 佇列是屬於線性結構中的一種 2.圖示 3.通過陣列實現 public class circlearrayqueue 佇列頭部 public int front 佇列尾部 pu...
C語言版資料結構(從0開始) 4 佇列
2.3迴圈佇列 3.鏈佇列 1.佇列的概念 和棧一樣,佇列 queue 也是一種運算受限的線性表。它只允許在表的一端進行插入,而在另一端進行刪除。允許刪除的一端稱為隊頭 front 允許插入的一端稱為隊尾 rear 佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列...
資料結構(C語言版) 佇列
1 佇列 在表的一端插入,表的另一端刪除,允許插入的一端為隊尾,允許刪除的一端為隊頭。先進先出fifo。2 佇列的基本操作 initqueue q 構造空佇列 destroyqueue q 銷毀佇列 clearqueue q 清空佇列 queueempty q 判斷佇列是否為空 queuelengt...