迴圈佇列這樣理解就容易多啦

2021-10-05 22:52:00 字數 2154 閱讀 1085

① 初始時,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...