JavaScript——优先级队列

  • 优先级队列的特点:

    • 我们知道, 普通的队列插入一个元素, 数据会被放在后端. 并且需要前面所有的元素都处理完成后才会处理前面的数据.

    • 但是优先级队列, 在插入一个元素的时候会考虑该数据的优先级.(和其他数据优先级进行比较)

    • 比较完成后, 可以得出这个元素正确的队列中的位置. 其他处理方式, 和队列的处理方式一样.

    • 也就是说, 如果我们要实现优先级队列, 最主要是要修改添加方法. (当然, 还需要以某种方式来保存元素的优先级)

  • 优先级队列应用也非常广泛

    • 一个现实的例子就是机场登机的顺序

      • 头等舱和商务舱乘客的优先级要高于经济舱乘客。

      • 在有些国家,老年人和孕妇(或带小孩的妇女)登机时也享有高于其他乘客的优先级。

    • 另一个现实中的例子是医院的(急诊科)候诊室。

      • 医生会优先处理病情比较严重的患者。

      • 通常,护士会鉴别分类,根据患者病情的严重程度放号。

    • 计算机中, 我们也可以通过优先级队列来重新排序队列中任务的顺序

      • 比如每个线程处理的任务重要性不同, 我们可以通过优先级的大小, 来决定该线程在队列中被处理的次序.

 

我们使用JavaScript封装一个优先级队列 

function PriorityQueue() {
            function PriorityElement(element, Priority) {
                this.element = element
                this.Priority = Priority
            }
            this.item = []
            PriorityQueue.prototype.enqueue = function (element, Priority) {
                var queueElement = new PriorityElement(element, Priority)
                if (this.item.length == 0) {
                    this.item.push(queueElement);
                } else {
                    let Isadd = false
                    for (let i = 0; i < this.item.length; i++) {
                        if (queueElement.Priority < this.item[i].Priority) {
                            this.item.splice(i, 0, queueElement)
                            Isadd = true
                            break
                        }
                    }
                    if (!Isadd) {
                        this.item.push(queueElement)
                    }
                }
            }
            // 删除元素的方法
            PriorityQueue.prototype.dequeue = function () {
                return this.item.shift()
            }

            // 获取前端的元素
            PriorityQueue.prototype.front = function () {
                return this.item[0]
            }

            // 查看元素是否为空
            PriorityQueue.prototype.isEmpty = function () {
                return this.item.length == 0
            }

            // 获取元素的个数
            PriorityQueue.prototype.size = function () {
                return this.item.length
            }
        }

 

  • 代码解析:

    • 封装了一个QueueElement, 将element和priority封装在一起.

    • 在插入新的元素时, 有如下情况下考虑:

      • 根据新的元素先创建一个新的QueueElement对象.

      • 如果元素是第一个被加进来的, 那么不需要考虑太多, 直接加入数组中即可.

      • 如果是后面加进来的元素, 需要和前面加进来的元素依次对比优先级.

      • 一旦优先级, 大于某个元素, 就将该元素插入到元素这个元素的位置. 其他元素会依次向后移动.

      • 如果遍历了所有的元素, 没有找到某个元素被这个新元素的优先级低, 直接放在最后即可.

  • 队列的操作

    • enqueue(element):向队列尾部添加一个(或多个)新的项。

    • dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。

    • front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。

    • isEmpty():如果队列中不包含任何元素,返回true,否则返回false

    • size():返回队列包含的元素个数,与数组的length属性类似。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值