資料結構 第五天 佇列

2021-09-11 23:03:34 字數 2133 閱讀 1114

只允許在一端進行插入操作,而在另一端進行刪除操作的線性表,即是一種先進先出(fifo)的線性表。

抽象資料型別

adt 佇列(queue)

data

元素具有相同的型別,相鄰的元素具有前驅和後繼的關係

operation 

initqueue(*q)    //初始化操作,建立乙個空佇列q

destroyqueue(*q)    //若佇列q存在,則銷毀它

clearqueue(q)    //將佇列q清空

queueempty(q)  //若隊列為空,返回true,否則返回false

gethead(q,*e)    //若佇列存在且非空,用e返回佇列q的隊頭元素

enqueue(*q,e)   //若佇列q存在,插入新元素e到佇列q的隊尾

dequeue(*q,*e)  //刪除佇列q的隊尾元素,並用e返回其值

queuelength(q)  //返回佇列q的元素個數

endadt

若使用陣列儲存佇列,下標為0為開始,為n-1為末尾,為了減少操作的複雜度,定義兩個指標,front指向隊頭的元素,rear指向隊尾元素的下乙個元素,當兩指標相等時,隊列為空。

缺點在於隨著插入和刪除操作,rear指標可能移動到陣列之外,也稱為假溢位,即front指標前面還有空位未被利用。

為解決上述為題,當後面滿了,就再從頭開始,也就是頭尾銜接,這種頭尾相接的順序結構稱為迴圈佇列

判斷佇列是為空佇列還是滿佇列

方法一:設定標誌變數flag來判斷

方法二:保留乙個空閒單元,此時為滿,即front = rear時隊列為空,(rear+1)%queuesize == front時隊列為滿

通用的佇列長度計算公式:(rear-front+queuesize)%queuesize

結構**

typedef int qelemtype;

typedef struct

sqqueue;

初始化**

status initqueue(sqqueue *q)

求佇列長度

int queuelength(sqqueue q)

入佇列

status enqueue(sqqueue *q,qelemtype e)

出佇列

status enqueue(sqqueue *q,qelemtype *e)

本質就是單鏈表,只是只能尾進頭出,簡稱鏈佇列

頭指標front指向頭節點,尾指標rear指向尾節點,空佇列時,均指向頭節點

結構定義

typedef int qelemtype;

typedef struct qnode //節點結構

qnode,*queueptr;

typedef struct //佇列的鍊錶結構

linkqueue;

入隊操作

status enqueue(sqqueue *q,qelemtype e)

出隊操作

status dequeue(linkqueue *q,qelemtype *e)

迴圈佇列與鏈佇列的出入操作均只有乙個複雜度o(1),但是空間上迴圈必須有乙個固定的長度,而鏈佇列又有指標域會導致一些空間開銷,故在佇列長度最大值確定的情況下,建議使用迴圈佇列,而無法估計最大長度時,使用鏈佇列

資料結構第五天

1.氣泡排序 氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,故名。步驟 比較相鄰的元素。如果第乙個比第二個大,就交...

python資料結構第五天

排序演算法的穩定性 穩定性 穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。假設以下的數對將要以他們的第乙個數字來排序。4,1 3,1 3,7 5,6 在這個狀況下,有可能產生兩種不同的結果,乙個是讓相等鍵值的紀錄維持相對的次序,而另外乙個則沒有 3,1 3,7 4,1 5,6 維持次序 3,7...

國慶第五天

直接在寢室待了乙個上午 一 matlab 試了一下昨天安裝的matlab2010b發現檔案都打不開,報這個錯 undefined function or method uiopen for input arguments of type char 二 c 1.找到了個之前 裡的乙個問題 把本週開頭和...