只允許在一端進行插入操作,而在另一端進行刪除操作的線性表,即是一種先進先出(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.找到了個之前 裡的乙個問題 把本週開頭和...