1.在之前的佇列中,因為是通過rear==maxsize-1判斷佇列是否滿了,而如果出隊後,front依次往後移動,這就會導致front前面的空間白白浪費掉,整個陣列空間其實並沒有滿,所以這裡就有了迴圈佇列
2.迴圈佇列這裡設定front為第乙個元素,而rear為最後乙個元素的下乙個元素,同時規定迴圈佇列最多只能有maxsize-1個佇列元素,當迴圈佇列中只剩下乙個空儲存單元時,佇列就已經滿了,也就是說定義了陣列a[4],在第一波入隊中,只有a[0],a[1],a[2]才能使用,a[3]則不能使用
之所以這樣設定,是因為入隊時,rear+1,尾指標追趕頭指標,而出隊時則是front+1,頭指標追趕頭指標,如果front就指向第乙個元素,rear指向最後乙個元素,當兩者相等時,你根本無法判斷是front+1後到達了rear的位置,還是rear+1之後到達了front所在的位置,此時就無法判斷佇列到底為空,還是滿了,因此rear需要預留乙個空間。相當於把最後乙個位置看做是front所在的第乙個元素的位置
這裡當rear到達了front的上乙個位置時,此時(rear+1)%maxsize== front,也就是說
而當兩者位置相同時,rear==front,就必然是front到達了rear的位置(因為在此之前就會判定(rear+1)%maxsize= =front,所以不可能是rear到達了front的位置),此時隊列為空
3.有效資料個數為 (rear + maxsize - front) % maxsize
%maxsize,是因為當rear>front時,rear + maxsize - front必然maxsize,這時%maxsize就知道它們之間隔了幾個元素,而當rear**測試
public
class
test
catch
(exception e)
break
;case
'h':
// 檢視佇列頭的資料
trycatch
(exception e)
break
;case
'e':
// 退出
scanner.
close()
; loop =
false
;break
;default
:break;}
} system.out.
println
("程式退出~~");
}}class
circlearray
// 判斷佇列是否滿
public
boolean
isfull()
// 判斷佇列是否為空
public
boolean
isempty()
// 新增資料到佇列
public
void
addqueue
(int n)
//直接將資料加入
arr[rear]
= n;
//將 rear 後移, 這裡必須考慮取模
rear =
(rear +1)
% maxsize;
}// 獲取佇列的資料, 出佇列
public
intgetqueue()
// 這裡需要分析出 front 是指向佇列的第乙個元素
// 1. 先把 front 對應的值保留到乙個臨時變數
// 2. 將 front 後移, 考慮取模
// 3. 將臨時儲存的變數返回
int value = arr[front]
; front =
(front +1)
% maxsize;
return value;
}// 顯示佇列的所有資料
public
void
showqueue()
// 思路:從 front 開始遍歷,遍歷多少個元素
// 動腦筋
for(
int i = front; i < front +
size()
; i++)}
// 求出當前佇列有效資料的個數
public
intsize()
// 顯示佇列的頭資料, 注意不是取出資料
public
intheadqueue()
return arr[front];}
}
(四)資料結構之迴圈佇列
之前不採用stl實現雙端佇列時我記得我就是使用了迴圈佇列。其實這是不規範的 雖然說使用很靈活,但我覺得還是應該分開來,避免弄混 所以誤區就是,迴圈佇列是不允許彈出隊尾或新增隊首的,也就是說它是最傳統的佇列,嚴格符合 先進先出,後進後出 的特點!判斷佇列是否滿有兩種解決方法 少用乙個單元,規定頭 fr...
資料結構 佇列 迴圈佇列
在佇列的陣列實現中,我們很容易發現數在出隊後,陣列的前面部分會有剩餘空間沒有被使用,所以我們為了最大程度的利用固定長度的陣列,我們採用迴圈佇列的儲存方式,這種方式的最大問題在於resize的時候比較麻煩,所以我們不考慮resize的情況。基本結構如下,這裡front指向第乙個元素的位置,rear指向...
資料結構 佇列 迴圈佇列
資料結構 佇列 迴圈佇列 順序儲存 犧牲乙個空間單元來判段佇列滿狀態。q.front q.rear 1 initsize date 2017 4 16 include define elemtype char define initsize 100 typedef structsqqueue voi...