ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-08 18:02:36  阅读:257  来源: 互联网

标签:priority 01 queueElement items JavaScript ---- enqueue var PriorityQueue


最近在用javascript刷数据结构和算法,教程是B站上面coderwhy王红元老师的视频----六天精通JavaScript数据结构与算法系统教程,js入门到精通算法,
数据结构和算法是前端进入大厂必备的知识和技能,以前在校招的时候不懂,为什么前端还总爱考数据结构和算法,对于我这种非计算机专业的学生很不友好,现在自我可以独立解决一些常见的项目问题了,就感觉自己需要进阶了,需要去锻炼一下自己的逻辑能力了,正好借着大四在公司实习的这段时间学习一下。重新来到csdn来记录一下自己将来一段时间的成长和收获,以及再敲代码的过程中自己所遇到的逻辑上的难点。

  以下是我自己,按照老师的讲解自己重新用数组封装了数据结构里面的优先级队列,
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>优先级队列</title>
</head>
<body>
    <script>
        function PriorityQueue() {
            var items = []
            function QueueElement(element,priority) {
                this.element = element
                this.priority = priority
            }
            PriorityQueue.prototype.enqueue = function(element,priority) {
                var queueElement = new QueueElement(element,priority) 
                if(this.isEmpty()) {
                    items.push(queueElement)
                }else {
                    var addEnd = true
                    for(var i=0; i<items.length;i++){
                        if(queueElement.priority < items[i].priority) {
                            addEnd = false
                            items.splice(i,0,queueElement)
                            break
                        }
                    }
                    if(addEnd) {
                        items.push(queueElement)
                    }
                }
            }

            PriorityQueue.prototype.dequeue = function() {
                return items.shift()
            }

            PriorityQueue.prototype.front = function() {
                return items[0]
            }

            PriorityQueue.prototype.isEmpty = function() {
                return items.length == 0
            }

            PriorityQueue.prototype.size = function() {
                return items.length
            }

            PriorityQueue.prototype.toString = function() {
                var resultStr = ''
                for(var i=0; i<items.length;i++){
                    resultStr+=items[i].element+'-'+items[i].priority+' '
                }
                return resultStr
            }
        }

        var pQueue = new PriorityQueue()
        pQueue.enqueue('abc',10)
        pQueue.enqueue('cba',5)
        pQueue.enqueue('nba',12)
        pQueue.enqueue('mba',3)
        console.log(pQueue.toString());
    </script>
</body>
</html>
第一个遇到的问题就是,封装的QueueElement函数是放到PriorityQueue.prototype.enqueue
函数里面还是外面,一开始以为只能放到enqueue函数里面,因为放到外面,
里面访问不到外面的函数,放在里面也没报错,后来看老师的笔记,发现老师把
QueueElement函数放在了enqueue函数外面,于是就想到了,作用域链,放到外面
也会被找到,作用域链先从作用域里面查找,里面没有再向外面查找,而放在外面的
一个好处我感觉就是不会让enqueue函数再多加一层函数,可以减轻enqueue的负担。

第二个遇到的逻辑问题就是这里

 if(this.isEmpty()) {
                    items.push(queueElement)
                }else {
                    var addEnd = true
                    for(var i=0; i<items.length;i++){
                        if(queueElement.priority < items[i].priority) {
                            addEnd = false
                            items.splice(i,0,queueElement)
                            break
                        }
                    }
                    if(addEnd) {
                        items.push(queueElement)
                    }
                }
在判断优先级的时候,第一次没有break终止循环,导致的结果就是一个元素被重复
添加多次,而且第一次用了forEach循环,当break时,报错---break时一个无效的语句,
forEach循环不能用break跳出循环,第二个问题就是没有加addEnd标志位,没有考虑到
,如果添加的元素的优先级比之前的任何一个元素的优先级都小,那新添加的元素就不会又任何操作,
这不符合我们想要的逻辑,正常逻辑应该是,如果添加的元素的优先级都比之前的任何一个小,那么新添加的元素应该被插入到数组的最后面。

标签:priority,01,queueElement,items,JavaScript,----,enqueue,var,PriorityQueue
来源: https://blog.csdn.net/m0_47531829/article/details/122828149

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有