数据结构与算法-优先级队列


title: 数据结构与算法-优先级队列
date: 2020-06-11 21:30:37
tags:
- 数据结构与算法

优先级队列
  • 普通的队列插入一个元素,该元素位于最后端,在前面的数据都处理完后才会处理后插入的数据。
  • 优先级队列在插入时会考虑该数据的优先级(在普通队列添加一个属性存储优先级)
  • 在处理时根据优先级决定处理顺序,也就是根据优先级调整插入数据的位置

两个问题:1,元素多了一个优先级属性,这就需要用对象封装;2,入队时要比较插入位置

优先级队列数组实现

    //优先级队列数组实现
     function PriorityQueue(){
            function QueueElement(element,priority){
                this.element=element
                this.priority=priority
            }

            //封装属性(对象数组)
            this.items = []

            //1,入队,根据优先级入队
            PriorityQueue.prototype.enqueue = function(element,priority){
                //获取原先队列长度
                length=this.items.length

                //创建队列元素
                var queuelement=new QueueElement(element,priority)

                //原队列无元素就直接插入
                if(length==0){
                    this.items.push(queuelement)
                }else{
                //原队列有元素,1,在原队列间插入;2,在原队列后面追加
                    var insert = false
                    //这里只能获取到已有位置,如果在最后插入获取不到位置,就不能解决在尾部插入的问题
                    for(let i=0;i<length;i++){
                        //比较各个元素的优先级,寻找插入位置(规定数字越小优先级越高)(比较对象的属性值)
                        if(queuelement.priority<this.items[i].priority){
                            insert = true
                            //1,在原队列间插入
                            this.items.splice(i,0,queuelement)//这一条是最简做法,直接插入移动全全完成
                            break 
                        }
                    }
                    //2,在原队列后面追加
                    if(!insert){
                        this.items.push(queuelement)
                    } 
                }
            }
            //2,出队,前面出队
            PriorityQueue.prototype.dequeue = function(){
                return this.items.shift()
            }
            //其他操作和栈一样了
            PriorityQueue.prototype.size = function(){
                return this.items.length
            }
            PriorityQueue.prototype.front = function () {
                return this.items[0]
        }
     }
//验证
     let pq = new PriorityQueue()
     pq.enqueue('abc',111)
     pq.enqueue('cba',200)
     pq.enqueue('nba',50)
     pq.enqueue('nba',66)
     console.log(pq)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值