zoukankan      html  css  js  c++  java
  • 通过数组创建队列

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

  • 相关阅读:
    重写Django登录认证,实现用户名或者手机均可登录
    Django media文件夹详解
    Django admin使用
    python极验验证部署
    django 分页
    模板语言控制往哪个地址提交时,如果不填,默认往当前地址提交,也可以用request方法获取当前地址提交
    HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别
    ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析
    谈谈线程池的核心参数,描述核心流程、应该怎么正确使用
    深入CAS的底层实现机制,以及对应的使用风险
  • 原文地址:https://www.cnblogs.com/ting6/p/9725668.html
Copyright © 2011-2022 走看看