JavaScript队列结构Queue实现过程解析(2)

// 封装优先级队列 function PriorityQueue() { //内部类:在类里面再封装一个类;表示带优先级的数据 function QueueElement(element, priority) { this.element = element; this.priority = priority; } // 封装属性 this.items = [] // 1.实现按照优先级插入方法 PriorityQueue.prototype.enqueue = (element, priority) => { // 1.1.创建QueueElement对象 let queueElement = new QueueElement(element, priority) // 1.2.判断队列是否为空 if(this.items.length == 0){ this.items.push(queueElement) }else{ // 定义一个变量记录是否成功添加了新元素 let added = false for(let i of this.items){ // 让新插入的元素与原有元素进行优先级比较(priority越小,优先级越大) if(queueElement.priority < i.priority){ this.items.splice(i, 0, queueElement) added = true // 新元素已经找到插入位置了可以使用break停止循环 break } } // 新元素没有成功插入,就把它放在队列的最前面 if(!added){ this.items.push(queueElement) } } } // 2.dequeue():从队列中删除前端元素 PriorityQueue.prototype.dequeue = () => { return this.items.shift() } // 3.front():查看前端的元素 PriorityQueue.prototype.front = () => { return this.items[0] } // 4.isEmpty():查看队列是否为空 PriorityQueue.prototype.isEmpty = () => { return this.items.length == 0; } // 5.size():查看队列中元素的个数 PriorityQueue.prototype.size = () => { return this.items.length } // 6.toString():以字符串形式输出队列中的元素 PriorityQueue.prototype.toString = () => { let resultString = '' for (let i of this.items){ resultString += i.element + '-' + i.priority + ' ' } return resultString } }

测试代码:

// 测试代码 let pq = new PriorityQueue(); pq.enqueue('Tom',111); pq.enqueue('Hellen',200); pq.enqueue('Mary',30); pq.enqueue('Gogo',27); // 打印修改过后的优先队列对象 console.log(pq);

测试结果:

JavaScript队列结构Queue实现过程解析

3.2.注意点

关于数组方法splice用法:

splice(1,0,'Tom'):表示在索引为1的元素前面插入元素'Tom‘(也可以理解为从索引为1的元素开始删除,删除0个元素,再在索引为1的元素前面添加元素'Tom');

splice(1,1,'Tom'):表示从索引为1的元素开始删除(包括索引为1的元素),共删除1个元素,并添加元素'Tom'。即把索引为1的元素替换为元素'Tom'。

数组的push方法在数组、栈和队列中的形式:

数组:在数组[0,1,2]中,pop(3),结果为[0,1,2,3];

栈:执行pop(0),pop(1),pop(2),pop(3),从栈底到栈顶的元素分别为:0,1,2,3;如果看成数组,可写为[0,1,2,3],但是索引为3的元素3其实是栈顶元素;所以说栈的push方法是向栈顶添加元素(但在数组的视角下为向数组尾部添加元素);

队列:enqueue方法可以由数组的push方法实现,与数组相同,相当于在数组尾部添加元素。

可以这样想:栈结构是头朝下(索引值由下往上增大)的数组结构。

JavaScript队列结构Queue实现过程解析

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/46b9a7ba869890a9baa4ef4942da801c.html