优先级队列的代码实现
- 创建优先级队列类
- 类里面创建队列元素类,传入element和priority并用this保存
- 属性还是用数组实现
- 写PriorityQueue的各种方法
- 插入需特别关注一下
- 插入时候需按优先级大小插入
- if为空就直接插入
- 不为空,for循环遍历
- if插入元素的优先级小于遍历的这个优先级
- 就splice插入,并将added标签改为true
- 如果遍历一圈,插入的元素优先级数值都大于这些遍历的元素,就直接push到后面去 其他删除等操作都与queue相同
<script>
function PriorityQueue() {
function QueueElement(element, priority) {
this.element = element
this.priority = priority
}
this.items = []
PriorityQueue.prototype.enqueue = function (element, priority) {
var qe = new QueueElement(element, priority)
var added = false
if (this.items.length == 0) {
this.items.push(qe)
} else {
for (var i = 0; i < this.items.length; i++) {
if (qe.priority < this.items[i].priority){
this.items.splice(i,0,qe)
added = true
break
}
}
if(!added) {
this.items.push(qe)
}
}
}
PriorityQueue.prototype.dequeue = function () {
return this.items.shift()
}
PriorityQueue.prototype.front = function () {
return this.items[0]
}
PriorityQueue.prototype.isEmpty = function () {
return this.items.length == 0
}
PriorityQueue.prototype.size = function () {
return this.items.length
}
PriorityQueue.prototype.toString = function () {
var str = ''
for (var i = 0; i < this.items.length; i++) {
str += this.items[i].element + '-' + this.items[i].priority + ' '
}
return str
}
}
var pq = new PriorityQueue()
pq.enqueue('djp',111)
pq.enqueue('jpp',222)
pq.enqueue('dadf',30)
pq.enqueue('da',2)
console.log(pq.toString());
</script>
链表
优点:
- 内存空间不必连续,可充分利用内存实现灵活的内存动态管理
- 不必在创建时就确定大小,并且它可以无限延伸下去
- 插入删除时时间复杂度可以达到O(1),比数组效率高
- 缺点:
- 访问元素时都需要从头开始访问
- 无法通过下标查找元素
链表结构
类似于一个火车