JavaScript數據結構和算法----隊列
阿新 • • 發佈:2017-07-23
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數據結構和算法----隊列