佇列是一種先進先出的線性表(fifo),出佇列的那一端叫做隊頭,入佇列的那一端叫做隊尾。作為線性表,同樣也有各種埠操作,不同的是插入資料只能在隊尾進行,刪除資料只能在隊頭進行。
同棧,佇列也有兩儲存方式,先來看看順序佇列。順序隊列入隊方式很簡單,就是在隊尾追加乙個元素,不需要移動任何元素。而出隊方式就只能從隊頭出列,假如有乙個隊列為a0,a1,a2,a3,下標分別為0,1,2,3,當出隊時,a0出隊,其餘的三個元素向前移動,保證下標為0的位置不為空,和線性表的順序儲存結構完全相同。為了減少出隊的時間複雜度,我們去掉佇列元素必須儲存在陣列的前n個單元這個條件。為了避免當只有乙個元素時,隊頭和隊尾重合使處理變得麻煩,所以引入兩個指標,front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置,這樣當front等於rear時,此佇列就為空佇列,即沒有元素。而在插入元素時front指標不動,rear指標向後移動,元素出隊時,rear不動,front向後移動,如果不停插入再出隊再插入最終會時rear指標指向界外,產生溢位,而前面front移動過的位置還是空的,我們稱這為「假溢位」。為了解決這個問題,我們把佇列的頭和尾相連起來,就是頭尾相接的迴圈佇列。當這樣又有乙個問題,不停的插入元素當rear迴圈一圈後又與front碰頭了怎麼辦?我們這裡給它設定乙個flag,當front == rear 並且flag = 0時隊列為空,當front == rear 且flag = 時,隊列為滿。還有一張辦法就是當隊列為空時,條件就是front == rear,當佇列滿時我們保留乙個元素空間,也就是說佇列元素和佇列空間差乙個單元。而佇列滿時rear與front直接可能差乙個元素空間或者差一圈,所以我們判斷佇列滿的條件就是(rear + 1) % queuesize == front ,這樣就能確定佇列是否為滿,queuesize 為佇列的最大尺寸,也就是容量。而佇列的通用長度計算公式為:(rear - front + queuesize)% queuesize。
迴圈佇列的順序儲存結構的操作**如下:
迴圈佇列的初始化:
迴圈佇列的入佇列:
迴圈佇列的出佇列:
只要是順序儲存結構它的大小必定受到限制,所以對於不受大小限制的結構我們都用鏈式結構,下次再來介紹鏈式結構佇列的知識吧。
佇列 順序儲存結構,迴圈佇列
為什麼小甲魚上節課說佇列的實現上我們更願意用鏈式儲存結構來儲存?我們先按照應有的思路來考慮下如何構造佇列的順序儲存結構,然後發掘都遇到了什麼麻煩。我們假設乙個佇列有n個元素,則順序儲存的佇列需建立乙個大於n的儲存單元,並把佇列的所有元素儲存在陣列的前n個單元,陣列下標為0的一端則是隊頭。no pic...
資料結構 佇列 順序儲存結構佇列 鏈式儲存結構佇列
佇列是一種只允許在一端進行插入操作,而在另外一端進行刪除操作的線性表,特徵是先進先出,包括 順序儲存結 構佇列 鏈式儲存結構佇列。重點說明 迴圈佇列和鏈隊。在佇列中front為隊頭指標 rear為隊尾指標 佇列 佇列空的條件 rear front 佇列滿的條件 rear 1 queuesize fr...
佇列的順序儲存結構和鏈式儲存結構
佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表 在隊尾進行插入操作,在對頭進行刪除操作 與棧相反,佇列是一種 先進先出 first in first out,fifo 的線性表。與棧相同的是,佇列也是一種重要的線性結構,實現乙個佇列同樣需要順序表或鍊錶作為基礎。佇列既可...