javascript資料結構與演算法筆記(四):迴圈佇列
阿新 • • 發佈:2018-12-27
javascript資料結構與演算法筆記(四):迴圈佇列
一:簡介
迴圈佇列是指佇列頭元素的移除會追加到佇列的尾部。我們此次拿一個例子來實現迴圈佇列,例子名就是模擬民間遊戲擊鼓傳花即:數人或幾十人圍成圓圈坐下,其中一人拿花(或一小物件);另有一人揹著大家或矇眼擊鼓(桌子、黑板或其他能發出聲音的物體),鼓響時眾人開始依次傳花,至鼓停止為止。此時花在誰手中(或其座位前),誰就上臺表演節目(多是唱歌、跳舞、說笑話;或回答問題、猜謎、按紙條規定行事等);偶然如果花在兩人手中,則兩人可通過猜拳或其它方式決定負者。
二:ES6版Queue類
1.使用WeakMap類宣告PriorityQueue類
具體原因可以參照:https://blog.csdn.net/wushichao0325/article/details/84969725
let Queue=(function(){
const items=new WeakMap();
class Queue{
constructor(){
items.set(this,[]);
}
enqueue(element){
let q=items.get (this);
q.push(element);
}
dequeue(){
let q=items.get(this);
let r=q.shift();
return r;
}
front(){//檢視佇列頭元素
let q=items.get(this);
return q[0];
}
isEmpty(){
let q=items.get (this);
return q.length==0;
}
size(){
let q=items.get(this);
return q.length;
}
print(){
let q=items.get(this);
console.log(q.toString())
}
}
return Queue;
})();
2.迴圈佇列實現與運用
function circulQueue(list,num){
let queue=new Queue();
for(let i=0;i<list.length;i++){
queue.enqueue(list[i]);
}
let endvalue='';
let circuls=0;
while(queue.size()>1){
circuls++;
for(let i=0;i<num;i++){
queue.enqueue(queue.dequeue());//形成迴圈佇列
}
endvalue=queue.dequeue();
console.log(`${endvalue}在第${circuls}輪淘汰`);
}
return queue.dequeue();
}
注:num模擬規定敲幾下鼓就停止的條件。
3.使用
let names=['john','jack','tom','xiaohong','xiaoming','huahua'];
let win=circulQueue(names,10);
console.log(`勝利者為:${win}`)