相關知識
佇列是乙個插入操作和刪除操作受到限制的線性表資料結構。佇列的插入和刪除被限制在表的兩端,即插入操作只能在表的一端進行,而刪除操作只能在表的另一端進行,因此佇列又稱先進先出表。
順序儲存的佇列
佇列既可以採用順序儲存,也可以採用鏈結儲存來實現。下面給出了一種基於順序儲存的佇列實現方案:
該佇列儲存了 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...