JavaScript实现优先队列的两种方法

  • 优先队列中元素的添加和移除是基于优先级的,从优先队列中删除元素时,需要考虑优先权的限制。优先队列具有最高级先出(First In Largest Out)的行为特征。
    实现方法:
    1、按照优先级入队:
    // 封装需要入队的元素
    function queueElement(value,priority){
        this.value = value;
        this.priority = priority;
    }
    // 封装优先队列
    function priorityQueue(){
        // 声明队列
        let queue = [];
        // 入队
        this.enqueue = function(value,priority){
            // 声明入队的元素
            let ele = new queueElement(value,priority);
            // console.log(ele);
            // 当前元素是否已经入队
            flag = false;
            // 入队
            // 队列为空直接入队
            if(this.listsize() == 0){
                queue.push(ele);
                flag = true;
                // console.log(queue);
            }
            // 队列不为空,判断优先级,插入到正确位置
            else{
                for(let i=0;i<queue.length;i++){
                    if(ele.priority > queue[i].priority){
                        queue.splice(i,0,ele);
                        flag=true;
                        break;
                    }
                }
                if(!flag){
                    queue.push(ele);
                    flag=true;
                }
            }
        }
        // 出队
        this.shift = function(){
            return queue.shift();
        }
        // 获取队首元素
        this.front = function(){
            console.log('队首元素:'+queue[0].value);
        }
        // 获取队列长度
        this.listsize = function(){
            return queue.length;
        }
        // 清空队列
        this.clearlist = function(){
            queue=[];
        }
        // 打印队列元素
        this.print = function(){
            for(let i=0;i<queue.length;i++)
                console.log('优先级:'+queue[i].priority+'  '+queue[i].value);
        }
    }
    
    测试一下:
    let queue = new priorityQueue();
    //入队
    queue.enqueue('bx',5);
    queue.enqueue('jyw',1);
    queue.enqueue('wmn',4);
    //打印
    queue.print();
    console.log('-------------');
    //出队
    queue.shift();
    queue.enqueue('hhh',3);
    queue.print();
    console.log('队列长度:'+queue.listsize());
    queue.front();
    
    结果如下:
    在这里插入图片描述
    2、按照优先级出队
    function Patient(name,code){
        this.name = name;
        this.code = code;//整数表示患者的优先级或病情严重程度
    }
    function Queue(){
        this.data = [];
        /*入队*/
        this.enqueue = function(element){
            this.data.push(element);
        };
        /*出队:删除队列中更拥有最高优先级的元素,优先码最小的元素优先级最高。*/
        this.dequeue = function(){
            var priority = this.data[0].code;
            //使用顺序查找方法寻找优先级最高的元素,优先码越小优先级越高
            for(var i=0; i<this.data.length; ++i){
                if(this.data[i].code < priority){
                    priority = i;
                }
            }
            return this.data.splice(priority,1);
        };
        this.toString = function(){
            var retstr = '';
            for(var i=0; i<this.data.length; ++i){
                retstr +=  this.data[i].name + " code: " + this.data[i].code + "\n";
            }
            return retstr;
        }
    }
    
    测试一下:
    /*test*/
    var queue = new Queue();
    var p = new Patient('smith',5);
    queue.enqueue(p);
    p = new Patient('jones',4);
    queue.enqueue(p);
    p = new Patient('fehrenbach',6);
    queue.enqueue(p);
    p = new Patient('brown',1);
    queue.enqueue(p);
    p = new Patient('ingram',1);
    queue.enqueue(p);
    console.log(queue.toString());
    var seen = queue.dequeue();
    console.log(queue.toString());
    
    结果如下:
    在这里插入图片描述

版权声明:本文为weixin_45006204原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。