js实现队列结构

队列先进先出,类似与生活中的排队,先进入队伍的就会优先获得服务,然后先离开队伍,后来的就排在队尾。
队列入队出队示意图
用js实现队列是主要有数组和对象两种实现方法,实现的代码如下:
1.通过数组实现队列

  <script>
        // 封装队列类
        function Queue() {
            // 属性
            this.items = [];
            // 方法
            // 1.将元素加入到队列中
            Queue.prototype.enqueue = function (element) {
                this.items.push(element);
            }
            // 2.从队列中删除前端元素
            Queue.prototype.dequeue = function () {
                return this.items.shift();
            }
            // 3.查看前端的元素
            Queue.prototype.front = function () {
                return this.items[0];
            }
            // 4.查看队列是否为空
            Queue.prototype.isEmpty = function () {
                return this.items.length == 0;
            }
            // 5.查看队列中元素个数
            Queue.prototype.size = function () {
                return this.items.length;
            }
            // 6.toString方法
            Queue.prototype.toString = function () {
                var str = ''
                for (var i = 0; i < this.items.length; i++) {
                    str = str + this.items[i] + ' ';
                }
                return str;
            }
        }
        // 使用队列
        /*var queue = new Queue();
        queue.enqueue('abc');
        queue.enqueue('def');
        queue.enqueue('ghl');
        console.log(queue.items);
        queue.dequeue();
        console.log(queue.items);
        console.log(queue.front());
        console.log(queue.isEmpty());
        console.log(queue.size());
        console.log(queue.toString());*/

        // 面试题:击鼓传花
        function gamePass(nameList, num) {
            // 1.定义一个队列结构
            var queue = new Queue();
            // 2.将所有人加入到队列中
            for (var i = 0; i < nameList.length; i++) {
                queue.enqueue(nameList[i]);
            }
            // 3.开始数数字
            while (queue.size() > 1) {
                // 不是num的时候,重新加入到队列尾部
                // 是num这个数字的时候,将其从队列中删除
                // 3.1.num数字之前的人重新放人队列尾部
                for (var i = 0; i < num - 1; i++) {
                    var detele = queue.dequeue();
                    var enter = queue.enqueue(detele);
                }
                // 3.2.num对应这个人,直接从队列中删除
                queue.dequeue();
            }
            // 4.获取队列中的那个人
            alert(queue.size());
            var endName = queue.front();
            alert('最终剩下的人:' + endName);
            return name.indexOf(endName);
        }
        console.log(gamePass(['mary', 'lili', 'chenjie', 'wangbo', 'sunshine'], 3))
    </script>

2.通过对象实现队列

 // 封装一个队列
        class Queue {
            constructor() {
                this.count = 0;
                this.items = {};
                this.lowestCount = 0; // 追踪第一个元素
            }
            enqueue(item) {
                this.items[this.count] = item;
                this.count++;
            };
            dequeue() {
                if (this.isEmpty()) return false;
                var result = this.items[this.lowestCount];
                delete this.items[this.lowestCount];
                this.lowestCount++;
                return result;
            };
            peek() {
                if (this.isEmpty()) return false;
                return this.items[this.lowestCount];
            };
            isEmpty() {
                return this.count - this.lowestCount == 0
            };
            size() {
                return this.count - this.lowestCount;
            };
            clear() {
                this.count = 0;
                this.items = {};
                this.lowestCount = 0; // 追踪第一个元素
            }
            toString() {
                let str = '';
                for (var i = this.lowestCount; i < this.count; i++) {
                    str += this.items[i] + ' ';
                }
                return str;
            }
        }
        // 测试代码
        // const queue = new Queue();
        // queue.enqueue('John')
        // queue.enqueue('Jack')
        // alert(queue.toString());
        // queue.enqueue('Camila'); 
        // alert(queue.toString());
        // alert(queue.size());
        // queue.dequeue()
        // queue.dequeue()
        // alert(queue.toString())
          // 击鼓传花
        function hotPotato(elementList, num) {
            var queue = new Queue();
            for (var i = 0; i < elementList.length; i++) {
                queue.enqueue(elementList[i]);
            }
            while (elementList.length != 1) {
                for (var i = 0; i < num; i++) {
                    queue.enqueue(queue.dequeue());
                }
                queue.dequeue();
                elementList.length--;
            }
            return queue.peek();
        }
        var List = ['John', 'Jack', 'Camila', 'Ingrid', 'Carl'];
        alert(hotPotato(List, 7));
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值