數(shù)據(jù)結(jié)構(gòu)-隊(duì)列(Queue )

一、什么是隊(duì)列赴蝇?
1.先進(jìn)者先出狸页,這就是典型的“隊(duì)列”結(jié)構(gòu)。
2.支持兩個(gè)操作:入隊(duì)enqueue()扯再,放一個(gè)數(shù)據(jù)到隊(duì)尾芍耘;出隊(duì)dequeue(),從隊(duì)頭取一個(gè)元素熄阻。
3.所以和棧一樣斋竞,隊(duì)列也是一種操作受限的線性表。

1.png

二秃殉、如何實(shí)現(xiàn)隊(duì)列坝初?
1.隊(duì)列API
public interface Queue<T> {
public void enqueue(T item); //入隊(duì)
public T dequeue(); //出隊(duì)
public int size(); //統(tǒng)計(jì)元素?cái)?shù)量
public boolean isNull(); //是否為空
}

    public class Queue
    {
        private string[] items;
        private int n = 0;

        private int head = 0;
        private int tail = 0;

        public Queue(int capacity)
        {
            items = new string[capacity];
            n = capacity;
        }

        /// <summary>
        /// 入隊(duì)
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public bool enqueue(string str)
        {
            //表示隊(duì)尾沒有空間了
            if (tail == n)
            {
                //隊(duì)列已滿,
                if (head == 0) return false;
                //當(dāng)隊(duì)尾沒有空間钾军,對(duì)頭有空間時(shí)鳄袍,將數(shù)據(jù)遷移
                for (int i = head; i < tail; i++)
                {
                    items[i - head] = items[i];
                }
                tail -= head;
                head = 0;
            }
            items[tail] = str;
            tail++;
            return true;
        }

        /// <summary>
        /// 出隊(duì)
        /// </summary>
        /// <returns></returns>
        public string dequeue()
        {
            //隊(duì)列為空
            if (tail == head) return "";
            string s = items[head];
            head++;
            return s;
        }
    }

三、隊(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)對(duì)一個(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ì)暑刃。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厢漩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岩臣,更是在濱河造成了極大的恐慌袁翁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婿脸,死亡現(xiàn)場離奇詭異粱胜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狐树,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門焙压,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抑钟,你說我怎么就攤上這事涯曲。” “怎么了在塔?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵幻件,是天一觀的道長。 經(jīng)常有香客問我蛔溃,道長绰沥,這世上最難降的妖魔是什么篱蝇? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮徽曲,結(jié)果婚禮上零截,老公的妹妹穿的比我還像新娘。我一直安慰自己秃臣,他們只是感情好涧衙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奥此,像睡著了一般弧哎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稚虎,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天傻铣,我揣著相機(jī)與錄音,去河邊找鬼祥绞。 笑死非洲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜕径。 我是一名探鬼主播两踏,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兜喻!你這毒婦竟也來了梦染?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤朴皆,失蹤者是張志新(化名)和其女友劉穎帕识,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂铡,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肮疗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒接。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伪货。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钾怔,靈堂內(nèi)的尸體忽然破棺而出碱呼,到底是詐尸還是另有隱情,我是刑警寧澤宗侦,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布愚臀,位于F島的核電站,受9級(jí)特大地震影響矾利,放射性物質(zhì)發(fā)生泄漏姑裂。R本人自食惡果不足惜馋袜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炭分。 院中可真熱鬧,春花似錦剑肯、人聲如沸捧毛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀忧。三九已至,卻和暖如春溃睹,著一層夾襖步出監(jiān)牢的瞬間而账,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工因篇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泞辐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓竞滓,卻偏偏與公主長得像咐吼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子商佑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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