通过数组创建队列

队列遵循FIFO(先进先出)原则的一组有序的项。队列在尾部添加新元素,在顶部移除元素,最新添加的元素必须在队列的尾部。

根据队列的定义,我们需要为队列创建一下几个方法:

  • enqueue(elements): 向队尾添加一个或者多个元素;
  • dequeue (): 移除队列最前面的元素,并返回被移除的元素;
  • front () : 返回最先被添加的元素,只做查看用,不操作;
  • isEmpty () : 判断当前对列是否为空,如果没有任何元素,返回true,否则返回false;
  • size():返回队列包含的元素个数;

创建队列:

  • 通过es6语法定义QUEUE类;
  • 使用闭包封装QUEUE类;
  • 使用WeakMap 设置私有属性;
let queue = (function() {
    //使用WeakMap创建私有属性
    let item = new WeakMap();

   /** 
     * 队列
     * @class QUEUE  
     * @constructor   
     * @method 
     */
    class QUEUE {
        constructor() {
            item.set(this, []);
        }

       enqueue(elements){
          //如列,在队尾插入元素
          let enqueue = item.get(this);
          enqueue.push(elements);
        }

        dequeue() {
            //出列,从队列最前面移除一位
            let dequeue = item.get(this);
            dequeue.shift();

        }

        isEmpty() {
            //判断队列是否为空
            let isEmpty = item.get(this);
            return isEmpty.length === 0 ? true : false;
        }

        front() {
            //返回队列中第一个元素
            let front = item.get(this);
            return front[0];
        }

        size() {
            //返回队列的元素个数
            let size = item.get(this);
            return size.length;
        }

        print() {
            let print = item.get(this);
            console.log(print);
        }

    }
    return QUEUE;
})()

但是在实际情况中,会有优先级的情况存在,我们不能每次都将元素放到最后,优先级高的,我们需要进行优先级排序

在 queue()中新创建一个类,用来生成队列每个元素的属性(新元素:elements,优先级:priority):

/** 
     * 优先队列设置属性
     * @class QUEUEELEMENT     
     * @constructor
     * @param {string} elements
     * @param {number} priority
     */
    class QUEUEELEMENT {
        constructor(elements, priority = 3) {
            this.elements = elements;
            this.priority = priority;
        }
    }

修改enqueue方法:

      enqueue(elements, priority) {
            //如列,在队尾插入元素
            let enqueue = item.get(this);
            //实例化优先队列插入类
            let queueelement = new QUEUEELEMENT(elements, priority);
            //设置变量判断当前元素是否需要优先插入
            let flag = false;

            enqueue.forEach(function(item, index, arr) {
                //越小优先级越高,如1>2
                if (queueelement.priority < item.priority) {
                    //新元素优先级高,需要将新元素插入到当前元素前
                    enqueue.splice(index, 0, queueelement);
                    //更改状态
                    flag = true;
                    //跳出循环
                    console.log('跳出循环');
                    return;
                };
            });

            //当新插入的元素优先级和已有的元素优先级相同或者更低时,直接将新元素插入到队尾
            if (!flag) {
                enqueue.push(queueelement);
            };
            this.print();
        }

使用

let ss = new queue();
ss.enqueue('123');
ss.enqueue('123', 1);
ss.enqueue('123', 2);

结果如下

[ QUEUEELEMENT { elements: '123', priority: 1 },
 QUEUEELEMENT { elements: '123', priority: 2 },
 QUEUEELEMENT { elements: '123', priority: 3 } ]

我们发现,队列中插入的每个元素都具有一个elements,priority属性,根据优先级可以排序,在取队列中的某个元素时,需要选择elements才可以正确取出想要的元素,并且通过WeakMap的私有属性特征,将队列设置成只能在类内部作用域修改,无法再外部修改,更加安全。

文末福利:

福利一:前端,Java,产品经理,微信小程序,Python等资源合集大放送:https://www.jianshu.com/p/e8197d4d9880
福利二:微信小程序入门与实战全套详细视频教程:https://www.jianshu.com/p/e8197d4d9880



领取方式:
如果需要学习视频,欢迎关注 【编程微刊】微信公众号,回复【领取资源】一键领取以下所有干货资源,获取更多有用技术干货、文档资料。所有文档会持续更新,欢迎关注一起成长!



作者:喜欢坑队友的程序员
链接:https://www.jianshu.com/p/0c44bacb497e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/wangting888/p/9701664.html