程序猿日志——數(shù)據(jù)結(jié)構(gòu):隊(duì)列

導(dǎo)語(yǔ)
上一章程序猿日志——數(shù)據(jù)結(jié)構(gòu):棧中劫狠,介紹了棧是一種遵循后進(jìn)先出的受限集合题暖,本章探討一下線性表中另一種受限集合——隊(duì)列疏魏,隊(duì)列遵循的是先進(jìn)先出的原則。

目錄

1. 隊(duì)列
2. 優(yōu)先隊(duì)列
3. 循環(huán)隊(duì)列

1. 隊(duì)列

隊(duì)列既然遵從先進(jìn)先出的原則科贬,那么所有出隊(duì)操作都在最先進(jìn)入隊(duì)列的元素,所有入隊(duì)操作都發(fā)生在隊(duì)列最后一個(gè)元素后面鳖悠;


數(shù)據(jù)結(jié)構(gòu):隊(duì)列
//創(chuàng)建一個(gè)隊(duì)列的類榜掌,隊(duì)列遵循FIFO原則
function Queue(){
    //創(chuàng)建一個(gè)隊(duì)列
    var items = []
    //入隊(duì)操作,每次添加向隊(duì)列的最后一個(gè)元素后添加
    this.enqueue = function(){
        var elems = [].slice.call(arguments)
        elems.map((elem)=>{
            items.push(elem)
        })      
    }
    //出隊(duì)操作乘综,每次刪除元素憎账,都是刪除隊(duì)列的第一個(gè)元素
    this.dequeue = function(){
        return items.shift()
    }
    //返回隊(duì)列的首元素
    this.front = function(){
        return items[0]
    }
    //判斷是否為空隊(duì)列
    this.isEmpty = function(){
        return items.length === 0
    }
    //清空隊(duì)列
    this.clear = function(){
        items = []
    }
    //隊(duì)列元素個(gè)數(shù)
    this.size = function(){
        return items.length
    }
    //標(biāo)準(zhǔn)輸出
    this.print = function(){
        console.log(items)
    }
}
var queue = new Queue()
queue.enqueue(1,2,3,4,5)
queue.print()//[1,2,3,4,5]
queue.dequeue()//2
queue.print()//[2,3,4,5]
console.log(queue.front())//2
console.log(queue.size())//4

2. 優(yōu)先隊(duì)列

有時(shí)候,我們一般在排隊(duì)時(shí)會(huì)遵循先到先得卡辰,但是當(dāng)類似"老弱病殘"等弱勢(shì)群體也在隊(duì)伍中時(shí)胞皱,那么他們的優(yōu)先級(jí)較高,即便是“后進(jìn)”也可以先得的九妈;

數(shù)據(jù)結(jié)構(gòu):優(yōu)先隊(duì)列
//優(yōu)先隊(duì)列
//優(yōu)先隊(duì)列的每一個(gè)元素既包含值又包含優(yōu)先級(jí)
//根據(jù)元素的優(yōu)先級(jí)進(jìn)行排序反砌,優(yōu)先級(jí)高者排在前面
//如果優(yōu)先級(jí)的值較小的元素排在前面,叫做最小優(yōu)先隊(duì)列

//創(chuàng)建一個(gè)優(yōu)先隊(duì)列的類
function PriorityQueue(){
    //創(chuàng)建一個(gè)優(yōu)先隊(duì)列
    var items = []
    //創(chuàng)建一個(gè)優(yōu)先隊(duì)列元素的類
    function QueueElement(value,prior){
        this.value = value
        this.prior = prior
    }
    //入隊(duì)操作,給定入隊(duì)元素的的值和優(yōu)先級(jí)
    this.enqueue = function(value,prior){
        var queueElement = new QueueElement(value,prior)
        //先判斷隊(duì)列是否為空允蚣,若是直接入隊(duì)
        if(this.isEmpty()){
            items.push(queueElement)
        }else{
            //如果隊(duì)列不為空于颖,則將該元素和隊(duì)列每一個(gè)元素進(jìn)行遍歷比較優(yōu)先級(jí)
            //將該元素插入比起優(yōu)先級(jí)低一位的元素之前
            
            //設(shè)置一個(gè)狀態(tài)鎖,表示元素是否入列
            var added = false
            for(var i = 0; i<items.length;i++){
                if(queueElement.prior<items[i].prior){
                    items.splice(i,0,queueElement)
                    added = true
                    break
                }
            }
            //如果遍歷之后發(fā)現(xiàn)優(yōu)先級(jí)是最低嚷兔,則直接push到隊(duì)列最后
            if(!added){
                items.push(queueElement)
            }
        }
    }
    //出隊(duì)操作森渐,一樣是隊(duì)列的首元素先出
    this.dequeue = function(){
        return items.shift()
    }
    this.front = function(){
        return items[0]
    }
    this.isEmpty = function(){
        return items.length === 0
    }
    this.size = function(){
        return items.length
    }
    this.print = function(){
        items.forEach((item)=>{
            console.log(`value: ${item.value},prior: ${item.prior}\n`)
        })
        // console.log(items)
    }
}

var priorQueue = new PriorityQueue()
priorQueue.enqueue('foo',2)
priorQueue.enqueue('bar',1)
priorQueue.enqueue('baz',3)
priorQueue.print()
/*
    value: bar, prior: 1
    value: foo, prior: 2
    value: baz, prior: 3
*/

循環(huán)隊(duì)列

循環(huán)隊(duì)列做入,可以看做是擊鼓傳花的游戲,就是給定時(shí)間同衣,傳花到下一個(gè)人手中竟块,時(shí)間停止拿到花的人淘汰;

數(shù)據(jù)結(jié)構(gòu):循環(huán)隊(duì)列
//循環(huán)隊(duì)列(擊鼓傳花)
function hotPotato(elems,num){
    var queue = new Queue()
    //將給定的元素傳入隊(duì)列
    elems.forEach((elem)=>{
        queue.enqueue(elem)
    })
    var eliminated = ''
    while(queue.size()>1){
        //給定傳遞花的次數(shù)
        for(var i=0; i<num;i++){
            queue.enqueue(queue.dequeue())
        }
        eliminated = queue.dequeue()
        console.log(`${eliminated}在擊鼓傳花游戲中被淘汰`)
    }
    //返回剩余最后一個(gè)元素
    return queue.dequeue()
}
var elems = ['foo','bar','baz','hub']
var winner = hotPotato(elems,8)
console.log(`勝利者:${winner}`)
/*
 foo在擊鼓傳花游戲中被淘汰
 hub在擊鼓傳花游戲中被淘汰
 bar在擊鼓傳花游戲中被淘汰
 勝利者:baz
*/



function Queue(){
    
    var items = []
    //向隊(duì)列添加1個(gè)或多個(gè)元素耐齐,注意是在隊(duì)列尾部添加
    this.enqueue = function(){
        var elems = [].slice.call(arguments)
        elems.map((item)=>{
            items.push(item)
        })
    }
    //刪除隊(duì)列第一個(gè)元素
    this.dequeue = function(){
        return items.shift()
    }
    //返回隊(duì)列的第一個(gè)元素
    this.front = function(){
        return items[0]
    }
    this.isEmpty = function(){
        return items.length === 0
    }
    this.size = function(){
        return items.length
    }
    this.print = function(){
        console.log(items)
    }
}

  • 本章節(jié)介紹了數(shù)據(jù)結(jié)構(gòu)中線性表的隊(duì)列結(jié)構(gòu)浪秘,隊(duì)列也是屬于一種受限的集合;
  • 隊(duì)列的特點(diǎn)的遵循先進(jìn)先出的原則(FIFO)埠况,入隊(duì)操作只能在隊(duì)列尾部耸携,出隊(duì)操作只能在隊(duì)列頭部;
  • 還介紹了隊(duì)列的兩種特殊情況辕翰,優(yōu)先隊(duì)列和循環(huán)隊(duì)列夺衍;
    本章代碼push在小羊的github地址,如有需要喜命,可以copy;

參考資料
Learning JavaScript Data Structures and Algorithms

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沟沙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壁榕,更是在濱河造成了極大的恐慌矛紫,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牌里,死亡現(xiàn)場(chǎng)離奇詭異颊咬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)二庵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門贪染,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人催享,你說(shuō)我怎么就攤上這事杭隙。” “怎么了因妙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵痰憎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我攀涵,道長(zhǎng)铣耘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任以故,我火速辦了婚禮蜗细,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己炉媒,他們只是感情好踪区,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吊骤,像睡著了一般缎岗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上白粉,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天传泊,我揣著相機(jī)與錄音,去河邊找鬼鸭巴。 笑死眷细,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奕扣。 我是一名探鬼主播薪鹦,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掌敬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惯豆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起奔害,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤楷兽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后华临,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芯杀,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年雅潭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭厚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扶供,死狀恐怖筛圆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椿浓,我是刑警寧澤太援,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站扳碍,受9級(jí)特大地震影響提岔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笋敞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一碱蒙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夯巷,春花似錦赛惩、人聲如沸巧还。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)麸祷。三九已至,卻和暖如春褒搔,著一層夾襖步出監(jiān)牢的瞬間阶牍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工星瘾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留走孽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓琳状,卻偏偏與公主長(zhǎng)得像磕瓷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子念逞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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