1. 程式人生 > >JavaScript數據結構和算法----隊列

JavaScript數據結構和算法----隊列

cga java log func rand 模擬 保存 ont 刪除

前言

  隊列和棧很像,只是用了不同的原則。隊列是遵循先進先出(FIFO)原則的一組有序的的項,隊列在尾部添加新元素,從頂部移除元素。最新添加的元素必須必須排隊在隊列的,末尾。可以想象食堂排隊買飯的樣子。

一、創建隊列

  1、創建一種數據結構來保存隊列裏面的數據,這裏選擇數組
  2、聲明一些棧的方法
  enqueue(element(s)) : 添加一個或一些元素到隊列的末尾
  dequeue() : 移除隊列第一個的元素(就是排隊在最前面的),同時返回被移除的元素。
  front() : 返回隊列第一個的元素(最先被添加的),僅僅是返回,不做任何修改。
  isEmpty() : 如果隊列裏面沒有任何元素就返回true,否者為false。
  clear() : 清除隊列裏面的元素。
  size() : 返回隊列裏面的個數。

function Queue(){
    
    var items = [];

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

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

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

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

    this.clear = function(){
        items = [];
    }

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

    this.print = function(){
        console.log(items.toString());
    } 
}

var queue = new Queue();
console.log(queue.isEmpty());
queue.enqueue(‘leaf‘);
queue.enqueue(‘jack‘)
console.log(queue.size());
console.log(queue.dequeue());
console.log(queue.isEmpty());
console.log(queue.size());

  

二、循環隊列 --擊鼓傳花遊戲

var nameList = [‘leaf‘, ‘jack‘, ‘jef‘, ‘rose‘, ‘red‘, ‘mandy‘, ‘hardy‘, ‘mark‘ ];
function cyclicGame(nameList){
    
    var queue = new Queue(),
        len = nameList.length;

    for(var i=0 ; i<len; i++){
        queue.enqueue(nameList[i]);
    }

    var weedOutName = ‘‘;
    while(queue.size()>1){
        for(var i=0; i<Math.floor(Math.random()*len); i++){
            queue.enqueue(queue.dequeue());//把第一個刪除了添加後面
        }
        weedOutName = queue.dequeue();
        console.log(weedOutName + ‘第‘+ (len-queue.size()) +‘輪被淘汰了!‘);
    }

    return console.log(queue.dequeue() + ‘是最後的勝利者!‘);//最後一個元素,勝利者

}

cyclicGame(nameList);

  

三、事件隊列管理

  JS的執行環境是單線程的,一次只能完成一個任務,其任務的調度方式就是排隊,這就在醫院掛號一樣,前面的那個人沒有搞定,你就只能站在後面排隊等著。在事件隊列中加一個延時,這樣的問題便可以得到緩解,下面用代碼模擬這個情景。

var Queue = {
    //保存隊列信息
    items : [],
    //添加到隊列
    enqueue : function(executeQueue){
        //添加到隊列,如果不是函數或者數字的不處理
        if(!/function|number/.test(typeof executeQueue)){
            return;
        }

        Queue.items.push(executeQueue);
        //返回自身的引用
        return Queue;
    },
    //執行隊列
    executeQueue : function(){
        //刪除隊列第一個元素並返回它
        var dequeue = Queue.items.shift();
        
        //如果隊列為空的,直接返回
        if(!dequeue){
            return;
        }

        //如果是函數,直接執行,然後繼續執行executeQueue
        if(typeof dequeue === "function"){
            dequeue();
            Queue.executeQueue();
            return;
        }

        //如果是數字,該數字作為延遲的時間, 延遲executeQueue
        setTimeout(function(){
            Queue.executeQueue();
            //console.log(dequeue);
        }, dequeue);
    }
};

//測試
Queue
//添加事件
.enqueue(function(){
    console.log(‘3秒之後執行第1個‘);
})
.enqueue(3000) 
.enqueue(function(){
    console.log(‘3秒之後執行第2個‘);
  })
.enqueue(3000)
.enqueue(function(){
    console.log(‘3秒之後執行第3個‘);
  })
//執行事件
.executeQueue();

  

JavaScript數據結構和算法----隊列