① 初始時,front=rear=0,front代表指向佇列的第乙個元素(即arr[front]是佇列的第乙個元素),rear代表指向佇列的最後乙個元素的後乙個元素,當front=rear時表示隊列為空,注意為空時不一定front=rear=0。想象成乙個圓形好理解一點。
② 如果把佇列填滿,這種情況下就會出現,當front=rear時佇列滿,這與隊列為空的條件相同,比如當front為0時,rear指向了maxsize-1處,如果此時再增加乙個元素,因為是迴圈佇列,當元素加到maxsize-1處時,rear會指向頭部0處,此時和front指向的位置相同,隊列為滿,但這樣就無法判斷到底佇列是空還是滿。
③ 針對②中的問題,我們可以預留乙個空間,即當隊列為滿時,總有乙個位置是空的且rear指向它,此時可能會出現兩種情況,一種是rear在front的右邊,此時rear指向maxsize-1,front指向0,另一種是rear在front的左邊,此時rear+1=front,因為是迴圈佇列,所以第一種情況當rear指向maxsize-1時,rear+1應=0=front,但如果要實現這一操作,可以通過取模運算,因為實際上rear+1=maxsize,當再對maxsize做取模運算時,結果恰好為0=front,且第二中情況下(rear+1)%maxsize,因為rear+1④ 佇列長度的計算:佇列長度的計算也需要考慮上述的兩種情況,rear在front的右邊和rear在front的左邊,當rear在front右邊時,佇列長度就為rear-front,當rear在front左邊時,此時佇列可分為左右兩段,左邊長度為rear-0,右邊長度為maxsize-front,佇列長度應為rear-front+maxsize,如果要把這兩種情況統一起來,同樣可以考慮取模運算,即佇列長度=(rear-front+maxsize)%maxsize,因為第一種情況rear-front>0,再加了乙個maxsize再對maxsize取模,結果仍為rear-front,第二種情況rear-front+maxsize⑥ 在取出元素時,首先判斷佇列是否空,如果不空,取出arr[front],然後不能直接front++,因為如果front=maxsize-1時,front++應等於0,所以front=(front+1)%maxsize.
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];}
}
佇列 迴圈佇列
迴圈佇列是乙個大小確定的特殊佇列,它的特殊體現在迴圈,之前提到的普通佇列,我們是用鍊錶來實現的,在這裡,由於迴圈佇列是乙個長度確定的佇列,所以我們可以拿順序表來實現。迴圈佇列的操作與普通佇列類似,不過不同的地方在於當rear走到capacity 1並且front在0號元素位置的時候,當此時再有元素入...
迴圈佇列 622 設計迴圈佇列
設計你的迴圈佇列實現。迴圈佇列是一種線性資料結構,其操作表現基於fifo 先進先出 原則並且隊尾被連線在隊首之後以形成乙個迴圈。它也被稱為環形緩衝器。迴圈佇列的乙個好處是我們可以利用這個佇列之前用過的空間。在乙個普通佇列裡,一旦乙個佇列滿了,我們就不能插入下乙個元素,即使在佇列前面仍有空間。但是使用...
佇列(迴圈佇列 鏈佇列)
迴圈佇列 cirqueue.h 名稱 迴圈佇列 基於陣列 templateclass cirqueue q size 1 多申請乙個位置,保證隊滿 對空容易判定!cirqueue void enter datatype data 入隊操作 datatype shift 出隊操作 datatype g...