javascript數據結構與算法筆記(四):循環隊列

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}`)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章