Java數(shù)據(jù)結(jié)構(gòu)和算法(八)隊(duì)列


一芦缰、什么是隊(duì)列企巢?

1.先進(jìn)先出,后進(jìn)后出让蕾,這就是典型的“隊(duì)列”結(jié)構(gòu)浪规。

2.支持兩個(gè)操作:入隊(duì)enqueue(),放一個(gè)數(shù)據(jù)到隊(duì)尾探孝;出隊(duì)dequeue()笋婿,從隊(duì)頭取一個(gè)元素。

3.所以再姑,和棧一樣萌抵,隊(duì)列也是一種操作受限的線性表找御。

二元镀、隊(duì)列有哪些常見的應(yīng)用?

1.阻塞隊(duì)列

1)在隊(duì)列的基礎(chǔ)上增加阻塞操作霎桅,就成了阻塞隊(duì)列栖疑。

2)阻塞隊(duì)列就是在隊(duì)列為空的時(shí)候,從隊(duì)頭取數(shù)據(jù)會(huì)被阻塞滔驶,因?yàn)榇藭r(shí)還沒有數(shù)據(jù)可取遇革,直到隊(duì)列中有了數(shù)據(jù)才能返回;如果隊(duì)列已經(jīng)滿了,那么插入數(shù)據(jù)的操作就會(huì)被阻塞萝快,直到隊(duì)列中有空閑位置后再插入數(shù)據(jù)锻霎,然后在返回。

3)從上面的定義可以看出這就是一個(gè)“生產(chǎn)者-消費(fèi)者模型”揪漩。這種基于阻塞隊(duì)列實(shí)現(xiàn)的“生產(chǎn)者-消費(fèi)者模型”可以有效地協(xié)調(diào)生產(chǎn)和消費(fèi)的速度旋恼。當(dāng)“生產(chǎn)者”生產(chǎn)數(shù)據(jù)的速度過快,“消費(fèi)者”來不及消費(fèi)時(shí)奄容,存儲(chǔ)數(shù)據(jù)的隊(duì)列很快就會(huì)滿了冰更,這時(shí)生產(chǎn)者就阻塞等待,直到“消費(fèi)者”消費(fèi)了數(shù)據(jù)昂勒,“生產(chǎn)者”才會(huì)被喚醒繼續(xù)生產(chǎn)蜀细。不僅如此,基于阻塞隊(duì)列戈盈,我們還可以通過協(xié)調(diào)“生產(chǎn)者”和“消費(fèi)者”的個(gè)數(shù)奠衔,來提高數(shù)據(jù)處理效率,比如配置幾個(gè)消費(fèi)者塘娶,來應(yīng)對一個(gè)生產(chǎn)者涣觉。

2.并發(fā)隊(duì)列

1)在多線程的情況下,會(huì)有多個(gè)線程同時(shí)操作隊(duì)列血柳,這時(shí)就會(huì)存在線程安全問題官册。能夠有效解決線程安全問題的隊(duì)列就稱為并發(fā)隊(duì)列。

2)并發(fā)隊(duì)列簡單的實(shí)現(xiàn)就是在enqueue()难捌、dequeue()方法上加鎖膝宁,但是鎖粒度大并發(fā)度會(huì)比較低,同一時(shí)刻僅允許一個(gè)存或取操作根吁。

3)實(shí)際上员淫,基于數(shù)組的循環(huán)隊(duì)列利用CAS原子操作,可以實(shí)現(xiàn)非常高效的并發(fā)隊(duì)列击敌。這也是循環(huán)隊(duì)列比鏈?zhǔn)疥?duì)列應(yīng)用更加廣泛的原因介返。

3.線程池資源枯竭是的處理

在資源有限的場景,當(dāng)沒有空閑資源時(shí)沃斤,基本上都可以通過“隊(duì)列”這種數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)請求排隊(duì)

3圣蝎、循環(huán)隊(duì)列

1、循環(huán)隊(duì)列衡瓶,原本數(shù)組是有頭有尾的徘公,是一條直線。把首尾相連哮针,扳成了一個(gè)環(huán)关面。

2坦袍、在數(shù)組實(shí)現(xiàn)隊(duì)列的時(shí)候,會(huì)有數(shù)據(jù)搬移操作等太,要想解決數(shù)據(jù)搬移的問題捂齐,需要像環(huán)一樣的循環(huán)隊(duì)列。

3缩抡、要想寫出沒有 bug 的循環(huán)隊(duì)列的實(shí)現(xiàn)代碼辛燥,最關(guān)鍵的是,確定好隊(duì)空和隊(duì)滿的判定條件缝其。

1)隊(duì)列為空的判斷條件仍然是 head == tail挎塌。

2)當(dāng)隊(duì)滿時(shí),(tail+1)%n=head内边。 tail 指向的位置實(shí)際上是沒有存儲(chǔ)數(shù)據(jù)的榴都。所以,循環(huán)隊(duì)列會(huì)浪費(fèi)一個(gè)數(shù)組的存儲(chǔ)空間漠其。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘴高,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子和屎,更是在濱河造成了極大的恐慌拴驮,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柴信,死亡現(xiàn)場離奇詭異套啤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)随常,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門潜沦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绪氛,你說我怎么就攤上這事唆鸡。” “怎么了枣察?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵争占,是天一觀的道長。 經(jīng)常有香客問我序目,道長臂痕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任宛琅,我火速辦了婚禮刻蟹,結(jié)果婚禮上逗旁,老公的妹妹穿的比我還像新娘嘿辟。我一直安慰自己舆瘪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布红伦。 她就那樣靜靜地躺著英古,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昙读。 梳的紋絲不亂的頭發(fā)上召调,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音蛮浑,去河邊找鬼唠叛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沮稚,可吹牛的內(nèi)容都是我干的艺沼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蕴掏,長吁一口氣:“原來是場噩夢啊……” “哼障般!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盛杰,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤挽荡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后即供,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定拟,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年逗嫡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了办素。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祸穷,死狀恐怖性穿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雷滚,我是刑警寧澤需曾,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站祈远,受9級特大地震影響呆万,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜车份,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一谋减、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扫沼,春花似錦、人聲如沸镊掖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽总寻。三九已至,卻和暖如春梢为,著一層夾襖步出監(jiān)牢的瞬間渐行,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工铸董, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟印,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓粟害,卻偏偏與公主長得像旁理,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子我磁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容