优先级队列是不同于”先进先出“的队列,可以查看和取出优先级最高的元素;
优先级是数字越小优先级越高;
这里实现了:
- enqueue,插入元素;
-
dequeue,删除优先级最高的元素;
-
front,查看优先级最高的元素;
-
isEmpty,是否为空;
-
toString,重写toString();
这里讲一下最难的enqueue的实现:
先封装一个类中类,用于存放元素以及对应的优先级
// 类中类
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
插入分为三种情况:队列为空、有优先级比插入元素低的、没有优先级比插入元素低的:
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 (let 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);
}
}
};
完整代码:
function PriorityQueue() {
// 类中类
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
// 封装属性
this.items = [];
// 1.实现插入元素
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 (let 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);
}
}
};
// 2.从队列中删除前端元素
PriorityQueue.prototype.dequeue = function () {
return this.items.shift();
};
// 3.查看前端元素
PriorityQueue.prototype.front = function () {
return this.items[0];
};
// 4.查看队列是否为空
PriorityQueue.prototype.isEmpty = function () {
return this.items.length == 0;
};
// 5.查看队列中元素的个数
PriorityQueue.prototype.size = function () {
return this.items.length;
};
// 6.toString方法的实现
PriorityQueue.prototype.toString = function () {
let resultString = "";
for (let i = 0; i < this.items.length; i++) {
resultString +=
this.items[i].element + "-" + this.items[i].priority + " ";
}
return resultString;
};
}