优先级队列的封装

优先级队列的封装

 

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

 

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

 

首先创建一个名为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)
posted @ 2020-10-08 20:40  Treee  阅读(170)  评论(0)    收藏  举报