迴圈佇列C++實現

jack-feng發表於2020-12-12

背景

迴圈佇列的出現是為了克服普通佇列存在“假溢位”的現象,將儲存空間想象成一個首位相接的圓環,當寫指標寫到末尾後重新從首部寫入。由於儲存空間有限,當設計迴圈佇列時,需要考慮隊滿的情況,通常迴圈佇列在隊滿時都是丟棄新資料,不再寫入,但對於比如像實時訊號採集系統,就需要覆蓋舊資料,所以在設計時首先應該考慮該迴圈佇列隊滿時是丟棄新資料還是覆蓋舊資料,另外,對於丟棄新資料,通常也有三種實現方式,包括引入flag標記法、犧牲一個儲存單元法和引入資料元素計數法。迴圈佇列通用操作如下:
在這裡插入圖片描述

下面以C++模板方式簡單對4種方式進行介紹。

隊滿時覆蓋舊資料

該方法引入一個標誌成員flag,當寫指標追上讀指標時,flag置為true,每次讀資料後,都將flag置為false,通過flag狀態來判斷隊空還是隊滿,注意,每次當flag置為true時,都應該修改讀指標位置,因為是覆蓋舊資料,所以應該移動讀指標到寫指標位置。在這裡插入圖片描述
在這裡插入圖片描述

丟棄新資料—flag標記法

如果佇列設計為丟棄新資料,即寫指標最大位置是經過佇列長度後重新和讀指標重合,結果就導致隊滿和隊空都是Front == Rear。通過引入一個flag標記,當寫入有效資料後設定flag為true,讀取有效資料後設定flag為false,這樣在判別隊滿或對空時,如果flag為true,則為隊滿,如果flag為false,則為隊空。在這裡插入圖片描述

丟棄新資料—犧牲儲存單元法

在初始化迴圈佇列大小後,主動犧牲最後一個儲存單元,即最後一個儲存單元不存放資料。所以隊滿條件為:(Rear+1)% QueueSize == Front;隊空條件還是Rear == Front;

丟棄新資料—引入資料元素計數法

更簡單的方式是引入一個成員專門用於統計有效元素的個數,每寫入一個有效資料元素,即+1,沒讀取一個有效資料,即-1.通過該成員來判斷隊滿或隊空。

原始碼打包下載連結(以模板繼承方式實現)

下載連結請點選此處

相關文章