# 优先级队列结构
-
优先级队列的特点
- 我们知道,普通的队列插入一个元素,数据会被放在后端。并且需要前面所有的元素都处理完后才会处理前面的数据。
- 但是优先级队列,再插入一个元素的时候会考虑该数据的优先级。和其他数据优先级
进行比较
- 比较完成后,可以得出这个元素在队列中正确的位置
- 其他处理方式,和基本队列的处理方式一样。
-
优先级队列主要考虑的问题:
- 每个元素不再只是一个数据,而且包含数据的优先级
# Example
- 生活中的优先级队列例子
- 比如某些家庭在吃饭时,老人优先级更高,先动筷子,其次是父母,最后才是小孩。
- 你正在吃饭,突然非常想去五谷轮回之所,于是你就去了。
Example 1:
每次插入几组数据: | |
'Saber', 100 | |
'Nekoaimer', 1000 | |
'Lain', 10 | |
输出:'Lain', 10 'Saber', 100 'Nekoaimer', 1000 |
- 解释:第一个是为元素,第二个是为优先级。
那么这个例子我们就以认为数字越低 优先级越高来实现优先级队列
那么每次插入数据都会进行比较 排列,所以会得出这个结果。
Example 2:
每次插入几组数据: | |
'Saber', 1 | |
'Nekoaimer', 3 | |
'Lain', 2 | |
输出:Saber 1 Lain 2 Nekoaimer 3 |
# Solving Ideas
// 封装优先级队列 | |
function PriorityQueue() { | |
// 1. 内部类 | |
function QueueElement(el, priority) { | |
this.el = el | |
this.priority = priority | |
} | |
// 封装属性 | |
this.items = [] | |
// 封装方法 | |
// 实现插入方法 | |
PriorityQueue.prototype.enqueue = function (el, priority) { | |
// 1. 创建 QueueElement 对象 | |
const queueElement = new QueueElement(el ,priority) | |
console.log(queueElement); | |
// 3. 判断队列是否为空 | |
if (this.items.length === 0) { | |
this.items.push(queueElement) | |
} else { | |
let 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 | |
return; | |
} | |
} | |
this.items.push(queueElement) | |
} | |
} | |
// 4. 从队列中删除前端元素 | |
PriorityQueue.prototype.dequeue = function () { | |
return this.items.shift() | |
} | |
// 5. 查看前端的元素 | |
PriorityQueue.prototype.front = function () { | |
return this.items[0] | |
} | |
// 6. 查看队列是否为空 | |
PriorityQueue.prototype.isEmpty = function () { | |
return this.items.length === 0 | |
} | |
// 7. 查看队列中元素个数 | |
PriorityQueue.prototype.size = function () { | |
return this.items.length | |
} | |
// 8.toString 方法 | |
PriorityQueue.prototype.toString = function () { | |
let resStr = '' | |
for (key of this.items) { | |
resStr += key.el + ' ' + key.priority + ' ' | |
} | |
return resStr | |
} | |
} | |
// 测试代码 | |
const pq = new PriorityQueue() | |
pq.enqueue('Lain', 10) | |
pq.enqueue('Saber', 100) | |
pq.enqueue('Nekoaimer', 1000) | |
console.log(pq) | |
/* | |
PriorityQueue { | |
items: [ | |
QueueElement { el: 'Lain', priority: 10 }, | |
QueueElement { el: 'Saber', priority: 100 }, | |
QueueElement { el: 'Nekoaimer', priority: 1000 } | |
] | |
} | |
*/ | |
console.log(pq.toString()) // Lain 10 Saber 100 Nekoaimer 1000 |