隊列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)摹察,跟棧類似,隊列是一種操作受限的線性表倡鲸。
隊列同樣可以由數(shù)組和鏈表來實現(xiàn)供嚎。
隊列需要兩個指針:一個是 head 指針,指向隊頭;一個是 tail 指針克滴,指向隊尾逼争。
## 順序隊列
順序隊列存在一個問題, tail 指針移動到數(shù)組最大下標(biāo)時劝赔,即使數(shù)組中還有空閑空間誓焦,也無法繼續(xù)往隊列中添加數(shù)據(jù)了。
解決方法是在入隊列時着帽,如果沒有空閑空間罩阵,就觸發(fā)一次搬運,將 head 到 tail 之間的數(shù)據(jù)启摄,整體搬運到數(shù)組的 0 到 tail - head 位置。
## 鏈?zhǔn)疥犃?/p>
鏈?zhǔn)疥犃信c順序隊列的區(qū)別是沒有容量限制幽钢,在請求排隊的場景下歉备,如果排隊的請求數(shù)量過多,請求處理的響應(yīng)時間會過長匪燕。
## 循環(huán)隊列
循環(huán)隊列是為了解決順序隊列在 tail == n 時蕾羊,需要數(shù)據(jù)搬運操作的問題。
隊列為空時可以根據(jù) head == tail 來判斷帽驯。循環(huán)隊列滿時龟再,tail 指針位置不存儲數(shù)據(jù),所以隊滿判斷公式為:
(tail + 1) % n = head
## 阻塞和并發(fā)隊列
阻塞隊列在隊列為空的時候尼变,從隊頭取數(shù)據(jù)會被阻塞利凑,直到隊列中有數(shù)據(jù)才會返回;如果隊列已經(jīng)滿了嫌术,插入數(shù)據(jù)操作會被阻塞哀澈,直到隊列中有空閑的位置后再插入,然后再返回度气。
在考慮線程安全時割按,需要用到并發(fā)隊列,并發(fā)隊列同一時刻只允許一個插入操作磷籍,但是允許多個讀操作适荣。