优先级队列存在的场景
生活中类似优先排队
的场景
- 优先排队的人,优先处理。
- 排队的时候有
紧急情况
的人可以优先处理。
优先队列
优先级队列要考虑的两个问题:
- 元素自身不仅仅包含数据,还包含优先级。
- 在添加元素的过程中,根据优先级放入到正确的位置。
代码实现
const Queue = require('../03-队列/queue')
//优先级队列
//特征 在入队的时候会根据优先级大小进行入队,自身节点有两个属性,优先级和自身数据
//优先级节点元素
class QueueElement {
constructor(element, priority) {
this.element = element
this.priority = priority
}
}
class PriorityQueue extends Queue {
constructor() {
super()
}
//入队
enqueue(element, priority) {
const queueElement = new QueueElement(element, priority)
//如果当前队列为空,则直接入队
if (this.isEmpty()) {
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
break
}
}
if(!added) {
this.items.push(queueElement)
}
}
}
//出队
dequeue() {
super.dequeue()
}
//查看队头元素
front() {
super.dequeue()
}
//查看队列是否为空
isEmpty() {
super.isEmpty()
}
//查看队列长度
size() {
super.size()
}
// 打印当前队列元素
print() {
return this.items.map((item)=>item.element).join(" ")
}
}
module.exports = PriorityQueue
测试代码
const PriorityQueue = require('./priority-queue')
let queue = new PriorityQueue()
queue.enqueue(1, 1)
queue.enqueue(4, 4)
queue.enqueue(2, 2)
queue.enqueue(3, 3)
queue.enqueue(6, 6)
queue.enqueue(5, 5)
console.log(queue.print())