首页 > 其他 > 详细

优先级队列的封装

时间:2020-10-08 22:26:49      阅读:44      评论:0      收藏:0      [点我收藏+]

优先级队列的封装

 

优先级队列是队列的一种,不过它不是逐次向队列中添加元素,而是将元素的优先级与队列中元素的优先级进行比较,然后插入一个合适的位置。

 

优先级队列封装代码与队列封装代码类似,只不过多出一个比较的过程。

 

首先创建一个名为PriorityQueue的函数

接着封装属性,由于我们是基于数组封装的函数,所以函数内元素的属性为数组形式。

 

由于我们优先级队列传入的参数内不再只含有一个element元素,还多了一个优先级(priority)元素,所以为了方便操作。

我们在PriorityQueue函数内再创建一个函数,此函数相当于PriorityQueue的内置类。

 

与队列封装唯一不同的就是插入操作:

在优先级队列的插入操作中,我们要比较元素优先级的大小

首先判断队列内是否为空,若为空,则不用比较优先级大小,直接将元素插入队列

若不为空,我们用for循环遍历队列中的元素,一旦要插入元素的优先级小于队列内元素的优先级,就用splice方法将元素插入到队列内元素的位置上,此时因为元素已经插入,则不用再继续执行for循环,我们用break方法跳出

若我们要插入的元素的优先级比队列中所有元素的优先级都要大,我们则将元素插入到队列的最末尾

所以创建一个布尔型变量,初始值为false,当要插入的元素已经插入时,让此变量等于true

在for循环外面加一个if判断,如果此布尔型变量的值为false,则说明元素未插入,此时将元素用push方法插入到队列的最末尾。

 

注意,封装函数内应该再加入一个toString方法,否则我们用alert方法测试函数时,弹窗内不是队列内的元素,而是Object

 

代码如下:

        function PriorityQueue() {
            // 在priorityQueue中重新创建了一个类,可以理解成内部类
            function QueueElement(element, priority) {
                this.element = element
                this.priority = priority
            }
            //封装属性
            this.items = []

            //实现插入方法:
            PriorityQueue.prototype.enqueue = function (element, priority) {
                //1.创建queueElement对象
                var queueElement = new QueueElement(element, priority)

                //2.判断队列是否为空
                if (this.items.length == 0) {
                    this.items.push(queueElement)
                } else {
                    var added = false
                    for (var i = 0; i < this.items.length; i++) {
                        if (queueElement.priority < this.items[i].priority) {
                            this.items.splice(i, 0, queueElement)
                            added = true
                            break
                        }
                    }
                    if (!added) {
                        this.items.push(queueElement)
                    }

                }
            }
            PriorityQueue.prototype.toString = function () {
                var result = ‘‘
                for (var i = 0; i < this.items.length; i++) {
                    result += this.items[i].element + ‘ ‘ + this.items[i].priority + ‘ ‘
                }
                return result
            }
        }
        //测试方法
        var pq = new PriorityQueue()
        pq.enqueue(‘abc‘, 22)
        pq.enqueue(‘shj‘, 55)
        alert(pq)

优先级队列的封装

原文:https://www.cnblogs.com/Treee/p/13782637.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!