實現乙個順序儲存的佇列(資料結構與演算法 佇列)

2021-10-05 09:35:01 字數 2650 閱讀 5685

相關知識

佇列是乙個插入操作和刪除操作受到限制的線性表資料結構。佇列的插入和刪除被限制在表的兩端,即插入操作只能在表的一端進行,而刪除操作只能在表的另一端進行,因此佇列又稱先進先出表。

順序儲存的佇列

佇列既可以採用順序儲存,也可以採用鏈結儲存來實現。下面給出了一種基於順序儲存的佇列實現方案:

該佇列儲存了 4 個元素 ,其中 56 為佇列頭, 12 為佇列尾。

這種實現方案將佇列元素儲存在一片連續的空間中,並通過data、front、rear和max四個屬性元素組織成為乙個結構:

data: 給出佇列儲存空間的起始位址;

front: 為隊頭指標,它指向隊頭元素;

rear: 為隊尾指標,它指向下乙個入隊元素的儲存位置;

max: 指明佇列儲存空間中最多可儲存的資料元素個數。

(通常為了區分佇列空和滿,會在佇列尾留乙個空資料單元,此時佇列最多可放max-1個資料元素)

特別說明:空間的開始位址為data,連續空間裡的位置編號從data所指的開始位置起,到該空間的結束位置,編號依次是0,1,2,…,max-1。在圖1的示例中max=6。下乙個出隊元素(這裡是佇列的頭結點)所儲存的位置編號用front給出,下乙個入隊元素應儲存的位置編號用rear給出。

基於這些屬性要素組織成的佇列結構如下所示:

struct seqqueue 

;

隊列為空的判斷:當front與rear相等時,隊列為空。

隊列為滿的判斷:當front=0,rear=max-1或者front=rear+1時,隊列為滿。

出隊操作:出隊操作的前提是佇列不為空。每出隊乙個元素(將front處的元素出隊),就將front加 1 ;加 1後,如果front超出最後乙個位置max-1,就將front重新設定為 0 。

入隊操作:入隊操作的前提是佇列不為滿。每入隊乙個元素(新元素儲存在rear處),就將rear加 1 ;加 1後,如果rear超出最後乙個位置max-1,就將rear重新設定為 0 。

同時為了討論簡單,我們假設佇列元素的資料型別為整數:

typedef

int t;

// 佇列元素的資料型別

據此,只要給定指向該結構的一指標sq,就可對佇列進行出隊入隊操作。

在給定圖1的狀態下,連續 2 次出隊操作,這時的狀態則變為如圖 2 所示的狀態。

在給定圖 2 的狀態下,連續 2 次入隊操作(依次入隊 23 、78 ),這時的狀態則如圖 3 所示。

// 建立順序佇列, 佇列最多儲存maxlen個佇列元素

void

sq_free

(seqqueue* sq)

// 釋放佇列空間,以刪除佇列

void

sq_makeempty

(seqqueue* sq)

// 將佇列置空

bool

sq_isempty

(seqqueue* sq)

// 判斷佇列是否為空,為空返回true,否則返回false。

bool

sq_isfull

(seqqueue* sq)

// 判斷佇列是否為滿。為滿返回true,否則返回false。

intsq_length

(seqqueue* sq)

// 佇列長度

bool

sq_in

(seqqueue* sq, t x)

// 將x入隊。若入隊失敗(佇列滿),則返回false,否則返回true。

else

}bool

sq_out

(seqqueue* sq, t& item)

// 從佇列sq出隊乙個元素,返回時item為出隊的元素的值。若出隊成功(佇列不為空),則返回true,否則(佇列空),返回false,此時item不會返回有效值。

else

}bool

sq_head

(seqqueue* sq, t& head)

// 獲取佇列頭結點元素,返回時head儲存頭結點元素。

// 若獲取失敗(佇列空),則返回值為false,否則返回值為true。

else

}void

sq_print

(seqqueue* sq)

// 依次列印出佇列中的每個元素

for(i=sq-

>front; i!=sq-

>rear; i=

(i+1

)%sq-

>max)

printf

("\n");

}

資料結構 佇列 順序儲存結構佇列 鏈式儲存結構佇列

佇列是一種只允許在一端進行插入操作,而在另外一端進行刪除操作的線性表,特徵是先進先出,包括 順序儲存結 構佇列 鏈式儲存結構佇列。重點說明 迴圈佇列和鏈隊。在佇列中front為隊頭指標 rear為隊尾指標 佇列 佇列空的條件 rear front 佇列滿的條件 rear 1 queuesize fr...

資料結構之佇列(順序儲存),實現迴圈佇列

迴圈佇列利用順序佇列的第2種出隊方式 1.使用隊頭 front 向後移動,而不是通過將整個佇列向前移動,大大提高了出隊的效率。2.使用迴圈佇列,解決了第2種出隊方式浪費儲存空間的問題。3.也就是說,迴圈佇列出隊效率高,儲存空間利用率高。空佇列 迴圈佇列 插入元素 滿佇列 方法 1.利用取模 2.判斷...

資料結構順序佇列實現

如題 這是一套完整的可執行的 需要讀者有一定的基礎去閱讀 語言是用c語言實現 在c 環境中編寫 在c 中可直接執行 在c語言中需要改部分標頭檔案和輸出語句 標頭檔案 這要是 的宣告部分 ifndef head define head include using namespace std typed...