击鼓传花 队列形式

一.队列的属性和方法:

 1. enqueue(ele) 进入队列:向队列尾部添加。

 2. dequeue() 出队:移除队列的第一个元素,并返回被移除的元素

 3. front() 返回队列的第一个元素,只返回不出队

 4. isEmpty() 判断队列是否为空

 5. size() 返回队列包含元素的个数 

下面通过队列来玩一个击鼓传花的游戏

<script>
    //模拟一个简单的队列
    class newArr{
        constructor(){
            this.arr=[]
        }
        enqueue(element){//入队
            this.arr.push(element)
            return element //返回进来的那个元素
        }
        dequeue(){//出队
            return this.arr.shift() //返回出队的那一个
        }
        front(){//返回队列的第一个元素,只返回但不出列
            if(this.arr.length>0){
                return this.arr[0]
            }else{
                return undefined
            }
        }
        isEmpty(){
            return this.arr.length>0
        }
        size(){//返回队列的长度
            return this.arr.length
        }
    }
    let list = ['鲁班','程咬金','廉颇','夏侯惇','张飞','狂铁','八戒','老夫子']
    //通过队列来模拟 击鼓传话游戏。被叫到的人物就要被踢出局,没被叫到的人物依次排队继续等待被叫,最终只有一个人胜出
    function pass(list,num){//num代表第几个
        let arr =new newArr()
        for(let i=0;i<list.length;i++){
            arr.enqueue(list[i])//首先让他们成为队列
        }
        while(arr.size()>1){//只要队列的长度大于1就让它循环
            for(let i=0;i<num;i++){
                arr.enqueue(arr.dequeue())//让不符合条件的人物先出队,然后再入队
            }
            //此时符合条件的人物排到了第一个,把它踢出队列
            arr.dequeue()
        }
        return arr.front()//返回最终胜利者
    }
    console.log(pass(list,3))//狂铁胜利。
</script>
原文地址:https://www.cnblogs.com/menggege/p/14146717.html