SOURCE

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(JSON.stringify(q))
        }
    }
    return Queue
})()

// let queue = new Queue()
// console.log(queue.isEmpty())
// queue.enqueue(2343)
// queue.enqueue('rir')
// queue.print()

// 优先队列
function PriorityQueue() {
    let items = []
    function QueueElement(element, priority) {
        this.element = element
        this.priority = priority
    }

    this.enqueue = function (element, priority) {
        let queueElement = new QueueElement(element, priority)

        let added = false
        for (let i = 0; i < items.length; i++) {
            if (queueElement.priority < items[i].priority) {
                items.splice(i, 0, queueElement)
                added = true
                break
            }

        }

        if (!added) {
            items.push(queueElement)
        }
    }

    this.print = function () {
        for (let i = 0; i < items.length; i++) {
            console.log(`${items[i].element} - ${items[i].priority}`)
        }
    }
}

// let priorityQueue = new PriorityQueue()
// priorityQueue.enqueue('John', 2)
// priorityQueue.enqueue('Jack', 1)
// priorityQueue.enqueue('Camila', 1)
// priorityQueue.print()

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

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

    let eliminated = ''
    while (queue.size() > 1) {
        for (let i = 0; i < num; i++) {
            queue.enqueue(queue.dequeue())
        }
        eliminated = queue.dequeue()
        console.log(eliminated + '在击鼓传花游戏中淘汰')
    }
    
    return queue.dequeue()
}

let names = ['John','Jack','Camila','Ingrid','Carl']
let winner = hotPotato(names,7)
console.log('This winner is:' + winner)
console 命令行工具 X clear

                    
>
console