郝斌資料結構入門---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、迴圈隊列出隊偽演算法講解
一步搞定
6、如何判斷迴圈佇列是否為空
如果 front 和 rear的值相等,則該佇列就一定為空
7、如何判斷迴圈佇列是否已滿
預備知識:
front的值可能比rear大,front的值也可能比rear小,當然也可能兩者相等
兩種方式:
1、多增加一個標識引數
2、少用一個元素(n-1)【通常使用第二種方式】
如果 r 和 f 的值緊挨著,則佇列已滿。
用C語言偽演算法表示就是:
if ( (r+1)%陣列長度 == f )
已滿
else
不滿
求連結串列的長度: