欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过数组创建队列

程序员文章站 2024-03-02 16:04:52
...

队列遵循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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。