书接上文
我们知道上篇中 《前端仔之理解数据结构二 队列》中有说道:普通队列在插入一个元素时,数据会被放在队列的后端(rear),这就是我们说的(last in) 并且需在前面所有元素都处理完成之后才会处理新插入的数据(first out);
优先队列的特点
它和普通队列不一样 没在插入的时候都会考虑数据的优先级,更具优先级给他排队处理。
所以在插入的时候会考虑优先级。
每个元素现在不仅是一个数据了 而包含了优先级。
在添加过程中我们就要更具优先级放入正确的位置了
在此献丑啦上代码
//这是一个普通的队列容器
class Queue {
constructor() {
this.container = []
}
// 插入操作 向尾部添加一个或者多个新的项目
enqueue(element) {
this.container.push(element)
}
// 删除操作 移除队列的第一个项 并返回被移除元素
dequeue() {
return this.container.shift()
}
// 返回队列中的第一个元素————类似于stack 的peek
front() {
return this.container[0]
}
// 判断是否为空
isEmpty() {
return this.container.length == 0
}
// 返回队列的大小
size() {
return this.container.length
}
// 将队列中的内容转换成字符串的形式
toString() {
let str = ""
for (let i = 0; i < this.container.length; i++) {
str += this.container[i] + " "
}
return str;
}
}
//这里是优先队列的节点对象
class QueueElement {
constructor(element, priority) {
// 创建QueueElement对象
this.element = element
this.priority = priority
}
}
//这里我们就来定义一下优先队列拉
class PriorityQueue extends Queue{
//定义插入方法 方法重写
enqueue(element,priority){
//作为内部类使用
const queueElement = new QueueElement(element,priority);
if(this.isEmpty()){
this.container.push(queueElement);
}else{
let added = false;
for(let i=0;i<this.container.length;i++){
if(this.container[i].priority > queueElement.priority){
this.container.splice(i,0,queueElement);
added = true;
break;
}
}
if(!added){
this.container.push(queueElement);
}
}
}
}