title: 数据结构与算法-优先级队列
date: 2020-06-11 21:30:37
tags:
- 数据结构与算法
优先级队列
- 普通的队列插入一个元素,该元素位于最后端,在前面的数据都处理完后才会处理后插入的数据。
- 优先级队列在插入时会考虑该数据的优先级(在普通队列添加一个属性存储优先级)
- 在处理时根据优先级决定处理顺序,也就是根据优先级调整插入数据的位置
两个问题:1,元素多了一个优先级属性,这就需要用对象封装;2,入队时要比较插入位置
优先级队列数组实现
//优先级队列数组实现
function PriorityQueue(){
function QueueElement(element,priority){
this.element=element
this.priority=priority
}
//封装属性(对象数组)
this.items = []
//1,入队,根据优先级入队
PriorityQueue.prototype.enqueue = function(element,priority){
//获取原先队列长度
length=this.items.length
//创建队列元素
var queuelement=new QueueElement(element,priority)
//原队列无元素就直接插入
if(length==0){
this.items.push(queuelement)
}else{
//原队列有元素,1,在原队列间插入;2,在原队列后面追加
var insert = false
//这里只能获取到已有位置,如果在最后插入获取不到位置,就不能解决在尾部插入的问题
for(let i=0;i<length;i++){
//比较各个元素的优先级,寻找插入位置(规定数字越小优先级越高)(比较对象的属性值)
if(queuelement.priority<this.items[i].priority){
insert = true
//1,在原队列间插入
this.items.splice(i,0,queuelement)//这一条是最简做法,直接插入移动全全完成
break
}
}
//2,在原队列后面追加
if(!insert){
this.items.push(queuelement)
}
}
}
//2,出队,前面出队
PriorityQueue.prototype.dequeue = function(){
return this.items.shift()
}
//其他操作和栈一样了
PriorityQueue.prototype.size = function(){
return this.items.length
}
PriorityQueue.prototype.front = function () {
return this.items[0]
}
}
//验证
let pq = new PriorityQueue()
pq.enqueue('abc',111)
pq.enqueue('cba',200)
pq.enqueue('nba',50)
pq.enqueue('nba',66)
console.log(pq)