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));

猜你喜欢

转载自blog.csdn.net/weixin_52797317/article/details/127836403
今日推荐