JS数据结构(4)——优先级队列
优先级队列(Priority Queue):
- 普通的队列是插入一个元素,该元素会被放在队尾,必须等到该元素前面的所有元素都处理之后才会处理该元素。
- 但是优先级队列,在插入一个元素的时候要考虑该数据的优先级。
- 优先级队列,在插入一个元素的时候会先和其他数据的优先级进行比较,比较完成后,得到这个元素在队列中的正确的位置,然后入队。
- 优先级队列的其他操作,比如删除,查看队列长度等,和 普通的队列操作相同。
优先级队列的实现:
-
实现优先级队列相对于普通队列有两方面需要考虑:
(1)把元素和优先级封装在一起(可以封装一个新的构造函数)
(2)添加元素时,将新插入的元素的优先级和在队列中已经存在的元素优先级进行比较,找到当前元素要插入的正确位置。 -
优先级队列的代码实现:
// 封装优先级队列
function PriorityQueue() {
// 在PriorityQueue中重新创建一个类,和java中的内部类很相似
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
// 封装属性,用数组来存储队列
this.items = [];
// 入队
PriorityQueue.prototype.enQueue = function (element, priority) {
// 1.创建对象
var queueElement = new QueueElement(element, priority);
// 2.判断队列是否为空
if(this.items.length == 0)
this.items.push(queueElement);
else {
var flag = false;
for(var i = 0; i< this.items.length; i++){
if(queueElement.priority < this.items[i].priority){
this.items.splice(i,0,queueElement);
flag = true;
break;
}
}
if(!flag)
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.将队列元素按字符串格式输出
PriorityQueue.prototype.toString = function() {
var result = "";
for(var i = 0; i < this.items.length; i++)
result += this.items[i].element + " ";
return result;
}
}
// 测试
var pq = new PriorityQueue();
pq.enQueue('abc', 123);
console.log(pq.items);
// 结果输出:[ QueueElement { element: 'abc', priority: 123 } ]
pq.enQueue('bca', 110);
console.log(pq.items);
// 结果输出:
/*[
QueueElement { element: 'bca', priority: 110 },
QueueElement { element: 'abc', priority: 123 }
]*/
pq.enQueue('cab', 140);
console.log(pq.items);
//结果输出:
/*[
QueueElement { element: 'bca', priority: 110 },
QueueElement { element: 'abc', priority: 123 },
QueueElement { element: 'cab', priority: 140 }
]*/
console.log(pq.deQueue());
//结果输出:QueueElement { element: 'bca', priority: 110 }
因为其他操作和普通队列操作相同,所以不额外测试,在前面一节
JS数据结构——队列有关于队列各个方法的测试。