成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

我對(duì)JS隊(duì)列的學(xué)習(xí)

Cristic / 2190人閱讀

摘要:我對(duì)隊(duì)列的學(xué)習(xí)什么是隊(duì)列隊(duì)列是遵循先進(jìn)先出原則的一組有序的項(xiàng)。最新添加的元素必須排在隊(duì)列的末尾。隊(duì)列的學(xué)習(xí)隊(duì)列的操作其實(shí)是和棧是差不多的,但是隊(duì)列只允許新數(shù)據(jù)在后端進(jìn)行添加。這里是最小優(yōu)先隊(duì)列,優(yōu)先值較小的元素被放置在隊(duì)列最前面。

我對(duì)JS隊(duì)列的學(xué)習(xí) 什么是隊(duì)列

隊(duì)列是遵循FIFO(先進(jìn)先出)原則的一組有序的項(xiàng)。隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的末尾。

在具體應(yīng)用中通常用鏈表或者數(shù)組來(lái)實(shí)現(xiàn)。

隊(duì)列的學(xué)習(xí)

隊(duì)列的操作其實(shí)是和棧是差不多的,但是隊(duì)列只允許新數(shù)據(jù)在后端進(jìn)行添加。

1 創(chuàng)建隊(duì)列

聲明一個(gè)類

function Queue() {
    //這里是屬性和方法
}

需要一個(gè)用于存儲(chǔ)隊(duì)列中的元素的數(shù)據(jù)結(jié)構(gòu),這里選擇數(shù)組。

var items = [];

2 隊(duì)列的基本操作

添加元素到隊(duì)列(只能添加到隊(duì)列的末尾)

this.enqueue = function (element) {
    items.push(element);
}

移除隊(duì)列的第一項(xiàng),并返回被移除的元素

this.dequeue = function() {
    return items.shift();
}

獲取隊(duì)列最前面的元素

this.front = function() {
    return items[0];
}

判斷隊(duì)列是否為空

this.isEmpty = function() {
    return items.length == 0;
}

隊(duì)列的長(zhǎng)度

this.size = function() {
    return items.length;
}

隊(duì)列和棧的區(qū)別是dequeue()方法和front()方法,這是因?yàn)橄冗M(jìn)先出和后進(jìn)先出的原則不同。

使用Queue類

1.初始化類,驗(yàn)證是否為空

var queue = new Queue();
console.log(queue.isEmpty()); //true;

2.添加到隊(duì)列,判斷長(zhǎng)度

queue.enqueue("John");
queue.enqueue("Jack");
queeu.enqueue("Camila");

console.log(queue.size()); //3

3.移除兩個(gè)元素,判斷長(zhǎng)度

queue.dequeue(); 
queue.dequeeu(); 

console.log(queue.size()); //1;這時(shí)隊(duì)列只剩下Camila
優(yōu)先隊(duì)列

對(duì),這就是特權(quán)!比如登機(jī),頭等艙商務(wù)艙能和經(jīng)濟(jì)艙的登機(jī)順序一樣??肯定他們的優(yōu)先級(jí)高啊

實(shí)現(xiàn)一個(gè)優(yōu)先隊(duì)列,有兩種選項(xiàng):①設(shè)置優(yōu)先級(jí),然后在正確的位置添加元素。②用入列操作添加元素,然后按照優(yōu)先級(jí)移除它們。

就是登機(jī),你可以讓優(yōu)先級(jí)高的先進(jìn)去候車室,然后登機(jī)的時(shí)候按順序理所當(dāng)然的頭等艙的先登機(jī)。另一種就是頭等艙經(jīng)濟(jì)艙什么的進(jìn)去候車室的時(shí)候不按優(yōu)先級(jí),但是呢,等到登機(jī)的時(shí)候按照優(yōu)先級(jí)喊人進(jìn)去。

function PriorityQueue() {
    var items = [];

//創(chuàng)建一個(gè)元素包含了元素和優(yōu)先級(jí)
    function QueueElement (element, priority) {
        this.element = element;
        thie.priority = priority;
    };

    this.queue = function(element, priority) {
        var queueElement = new QueueElement(element, priority);

//隊(duì)列為空,直接添加到隊(duì)列(因?yàn)檫@時(shí)根本不用比較優(yōu)先級(jí)?。?        if(this.isEmpty()) {
            items.push(queueElement);
        } else {
            var added = false;
            //如果要添加的元素的優(yōu)先級(jí)小于某一位置元素,那么就把要添加的元素放在這一位置元素的前面(這里用了splice方法)
            //優(yōu)先級(jí)數(shù)字越小,優(yōu)先級(jí)越高,應(yīng)該越早處理,所以應(yīng)該越靠近隊(duì)列前面
            for(var i = 0; i < items.length; i++) {
                if(queueElement.priority < items[i].priority) {
                    items.splice(i, 0, queueElement);
                    added = true;
                    //插入新元素之后,終止隊(duì)列循環(huán)
                    break;
                }
            }
            //到這一步就意味著所有的元素都比要添加的元素的優(yōu)先級(jí)低,所以直接放到末尾就可以
            if(!added) {
                items.push(queueElement);
            }
        }
    };
}
var priorityQueue = new PriorityQueue();

priorityQueue.enqueue("John", 2);
priorityQueue.enqueue("Jack", 1);
priorityQueue.enqueue("Camila", 1);

得到的隊(duì)列就是 |Jack(1)|Camila(1)|John(2)|,優(yōu)先級(jí)相同只需要放到同優(yōu)先級(jí)的后面就可以。

這里是最小優(yōu)先隊(duì)列,優(yōu)先值較小的元素被放置在隊(duì)列最前面。

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

擊鼓傳花,孩子們圍成一個(gè)圓圈,把花盡快的傳遞給旁邊的人,某一時(shí)刻傳花停止,這個(gè)時(shí)候花在誰(shuí)手里誰(shuí)就淘汰。重復(fù)這個(gè)過(guò)程直到只剩下一個(gè)孩子。

function hotPotato(nameList, num) {
    var queue = new Queue();

//將所有的名字放入隊(duì)列
    for(var i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i]);
    }

    var eliminated = "";
    //一輪游戲淘汰一個(gè)人
    while(queue.size() > 1) {
        //一輪游戲傳鼓7次
        for(var i = 0; i < num; i++) {
            //傳鼓一次,你把花傳給別人,你就安全了(隊(duì)首的人拿花)
            //從隊(duì)列開頭移除一項(xiàng)放到隊(duì)尾
            queue.enqueue(queue.dequeue());
        }
        //一輪游戲結(jié)束,淘汰手里拿花的那個(gè)人,即隊(duì)首的那個(gè)
        eliminated = queue.dequeue();
        console.log(eliminated + "被淘汰");
    }

    //得到最后的隊(duì)首
    return queue.dequeue();
}

var names = ["John", "Jack", "Camila", "Ingrid", "Carl"];
var winner = hotPotato(names, 7);
console.log("勝利者" + winner);

結(jié)果:
Camila Jack Carl Ingrid依次被淘汰
勝利者:John

下一篇鏈表。。。。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86942.html

相關(guān)文章

  • 我對(duì)JS簡(jiǎn)單學(xué)習(xí)

    摘要:我對(duì)棧的學(xué)習(xí)因?yàn)槭莻€(gè)新手,所以都是最簡(jiǎn)單的知識(shí)學(xué)習(xí)梳理。棧是一種遵從后進(jìn)先出原則的有序集合,新添加的或者待刪除的元素都保留在棧的末尾,稱作棧頂,另一端叫做棧底。棧的學(xué)習(xí)棧的創(chuàng)建創(chuàng)建一個(gè)類來(lái)表示棧。對(duì)于棧來(lái)說(shuō)只能用和方法來(lái)進(jìn)行添加和刪除元素。 我對(duì)棧的學(xué)習(xí) 因?yàn)槭莻€(gè)新手,所以都是最簡(jiǎn)單的知識(shí)學(xué)習(xí)梳理。 什么是棧 數(shù)組是計(jì)算機(jī)科學(xué)中最常用的數(shù)據(jù)結(jié)構(gòu),是數(shù)據(jù)元素的集合。有時(shí)候我們需要一種添加...

    Cobub 評(píng)論0 收藏0
  • 談?wù)?em>我對(duì)js中定時(shí)器一點(diǎn)理解

    摘要:這兩個(gè)函數(shù)接受定時(shí)器的例如我們上面提到的兩個(gè)函數(shù)產(chǎn)生的定時(shí)器,并停止對(duì)定時(shí)器中指定函數(shù)的調(diào)用。注意,定時(shí)器雖然觸發(fā)了,但是并不會(huì)立即執(zhí)行,它只是把需要延遲執(zhí)行的函數(shù)加入了執(zhí)行隊(duì)列,在線程的某一個(gè)可用的時(shí)間點(diǎn),這個(gè)函數(shù)就能夠得到執(zhí)行。 擼了今年阿里、頭條和美團(tuán)的面試,我有一個(gè)重要發(fā)現(xiàn)....... javascript定時(shí)器工作原理是一個(gè)重要的基礎(chǔ)知識(shí)點(diǎn)。因?yàn)槎〞r(shí)器在單線程中工作,它們表...

    frontoldman 評(píng)論0 收藏0
  • 一道面試題引發(fā)思考 --- Event Loop

    摘要:想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出個(gè),可是你真的懂為什么嗎為什么是輸出為什么是輸出個(gè)這兩個(gè)問(wèn)題在我腦邊縈繞。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。 想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出10個(gè)10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個(gè)10?這兩個(gè)問(wèn)題在我腦...

    betacat 評(píng)論0 收藏0
  • 理解JSEvent Loop機(jī)制

    摘要:前言前幾天在理解的事件環(huán)機(jī)制中引發(fā)了我對(duì)瀏覽器里的好奇。接下來(lái)理解瀏覽器中的,先看一張圖堆和棧堆是用戶主動(dòng)請(qǐng)求而劃分出來(lái)的內(nèi)存區(qū)域,比如你,就是將一個(gè)對(duì)象存入堆中,可以理解為存對(duì)象。廢話不多說(shuō),直接上圖個(gè)人理解。參考資料運(yùn)行機(jī)制詳解再談 前言 前幾天在理解node的事件環(huán)機(jī)制中引發(fā)了我對(duì)瀏覽器里Event Loop的好奇。我們都知道javascript是單線程的,任務(wù)是需要一個(gè)一個(gè)按順...

    MASAILA 評(píng)論0 收藏0
  • 通過(guò)閱讀源碼來(lái)提高js知識(shí)

    摘要:在這篇文章中,分享了他如何克服恐懼并開始使用源代碼來(lái)提高他的知識(shí)和技能。不久之后,你正在閱讀的源代碼將引導(dǎo)您進(jìn)入規(guī)范。 通過(guò)閱讀源碼來(lái)提高js知識(shí) 原文傳送門:《Improve Your JavaScript Knowledge By Reading Source Code》 showImg(https://segmentfault.com/img/remote/14600000197...

    浠ラ箍 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<