1. 程式人生 > >郝斌資料結構入門---P35---佇列(迴圈佇列)

郝斌資料結構入門---P35---佇列(迴圈佇列)

郝斌資料結構入門---P35---佇列

線性結構的常見應用之一:佇列(頭部刪除,尾部插入)

定義:一種可以實現“ 先進先出 ”的儲存結構,佇列類似於排隊去買票(一端入,一端出)

分類:鏈式佇列(用連結串列實現),靜態佇列(用陣列實現),靜態佇列通常都必須是迴圈佇列。 

迴圈佇列: 

1、靜態佇列為什麼必須是迴圈佇列(f:front前,r:rear後)

r永遠指向當前佇列的最後一個元素的下一個位置!!!!!

f永遠指向第一個元素!!!

如果f指向第一個元素,r指向最後一個元素的下一個元素。

如果f指向第一個元素的前一個元素,r就指向最後一個元素。

它們兩個是錯開的。

如果是增加元素(入隊),r增加。如果是刪除元素(出隊),f增加。

上面是傳統的陣列實現佇列。(只能用一次)

下面是迴圈佇列:(可以多次使用)

初始狀態:只有“c”這個元素

增加:增加一個為“中”的元素,現在佇列的元素有“c”和“中”:(r增加一個位置,因為迴圈,到對頭部)

刪除:現在要刪除一個元素,刪除了“c”元素,剩下“中”元素(f增加一個位置)

增加:要增加一個為“國”元素,現在佇列的元素中有“中”和“國”兩個元素(r增加一個位置)

刪除:現在要刪除一個元素,刪除了“中”元素,剩下“國”元素(f增加一個位置,因為迴圈,到對頭部)

2、迴圈佇列需要幾個引數來確定

需要2個引數來確定

3、迴圈佇列各個引數的含義

front:指向第一個元素(佇列頭)

rear:最後一個的下一個元素(佇列尾的下一個)

2個引數在不同場合有不同的含義:

佇列初始化:front和rear的值都是零

佇列非空:front代表的是佇列的第一個元素,rear代表的是佇列的最後一個有效元素的下一個元素

佇列空:front和rear的值相等,但不一定是零

4、迴圈佇列入隊偽演算法講解(注意判斷r的位置)

第一步:先把將入隊的值存入到r所代表的位置

第二步:錯誤的寫法:    r=r+1;

                正確的寫法是:r=(r+1) % 陣列的長度

5、迴圈隊列出隊偽演算法講解

一步搞定

:f=(f+1) % 陣列的長度

6、如何判斷迴圈佇列是否為空

如果 front 和 rear的值相等,則該佇列就一定為空

7、如何判斷迴圈佇列是否已滿

預備知識:

front的值可能比rear大,front的值也可能比rear小,當然也可能兩者相等

兩種方式:

1、多增加一個標識引數

2、少用一個元素(n-1)【通常使用第二種方式】

如果 r 和 f 的值緊挨著,則佇列已滿。

用C語言偽演算法表示就是:

if ( (r+1)%陣列長度 == f )

        已滿

else

        不滿

求連結串列的長度: