迴圈佇列C++實現
背景
迴圈佇列的出現是為了克服普通佇列存在“假溢位”的現象,將儲存空間想象成一個首位相接的圓環,當寫指標寫到末尾後重新從首部寫入。由於儲存空間有限,當設計迴圈佇列時,需要考慮隊滿的情況,通常迴圈佇列在隊滿時都是丟棄新資料,不再寫入,但對於比如像實時訊號採集系統,就需要覆蓋舊資料,所以在設計時首先應該考慮該迴圈佇列隊滿時是丟棄新資料還是覆蓋舊資料,另外,對於丟棄新資料,通常也有三種實現方式,包括引入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.通過該成員來判斷隊滿或隊空。
原始碼打包下載連結(以模板繼承方式實現)
相關文章
- 佇列的一種實現:迴圈佇列佇列
- 靜態佇列,迴圈陣列實現佇列陣列
- c/c++線性迴圈佇列C++佇列
- 迴圈佇列的實現及細節佇列
- 佇列 和 迴圈佇列佇列
- 資料結構-迴圈佇列(Python實現)資料結構佇列Python
- LeetCode 迴圈佇列LeetCode佇列
- 基於迴圈佇列的BFS的原理及實現佇列
- 【資料結構】迴圈佇列 C語言實現資料結構佇列C語言
- 佇列 手算到機算 入門 佇列 迴圈佇列佇列
- Java版-資料結構-佇列(迴圈佇列)Java資料結構佇列
- 佇列的順序儲存--迴圈佇列的建立佇列
- 事件迴圈與任務佇列事件佇列
- 手擼MQ訊息佇列——迴圈陣列MQ佇列陣列
- Throwing cards away I(queue迴圈佇列)佇列
- 順序迴圈佇列的介面設計佇列
- 資料結構——迴圈佇列PTA習題資料結構佇列
- 【小白學演算法】3. 迴圈佇列演算法佇列
- 自定義單連結串列佇列的基本介面函式(非迴圈佇列)佇列函式
- node事件迴圈和訊息佇列簡單分析事件佇列
- 通過佇列實現棧OR通過棧實現佇列佇列
- Android Handler機制之迴圈訊息佇列的退出Android佇列
- 陣列迴圈陣列
- Python佇列的三種佇列實現方法Python佇列
- LeetCode題解:641. 設計迴圈雙端佇列,使用佇列,JavaScript,詳細註釋LeetCode佇列JavaScript
- 9. 題目:對佇列實現棧&用棧實現佇列佇列
- 10月15日 棧和佇列實現迴文數字佇列
- 深入分析Node.js事件迴圈與訊息佇列Node.js事件佇列
- 用棧實現佇列佇列
- 用佇列實現棧佇列
- 用 Rust 實現佇列Rust佇列
- 佇列(Queue)-c實現佇列
- PAT1008 陣列元素迴圈右移問題(java實現)陣列Java
- 鏈式佇列—用連結串列來實現佇列佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- Day 10| 232.用棧實現佇列 、 225. 用佇列實現棧佇列
- RabbitMQ實現延遲佇列MQ佇列
- RabbitMQ 實現延遲佇列MQ佇列