一、队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
重点:先进先出,后进后出
1.1、队列实现
可以基于数组或者链表来实现
只要知道队列的特性就可以很简单的基于数组实现一个队列
代码演示
class Queue {
constructor() {
this.items = []
}
enQueue(element) {
this.items.push(element)
}
deQueue() {
return this.items.shift()
}
front() {
return this.items[0]
}
isEmpty() {
return this.items.length === 0
}
size() {
return this.items.length
}
toString() {
return this.items.join(',')
}
}
let s = new Queue()
s.enQueue(1)
s.enQueue(2)
s.enQueue(3)
console.log(s)
console.log(s.deQueue())
console.log(s.front())
console.log(s.isEmpty())
console.log(s.size())
console.log(s.toString())
class PassGame extends Queue {
set(name) {
super.enQueue(name)
}
take(num) {
while (super.size() > 1) {
for (let i = 0; i < num - 1; i++) {
super.enQueue(super.deQueue())
}
super.deQueue()
}
return super.front()
}
}
let a = new PassGame()
a.set('xw')
a.set('xh')
a.set('xz')
a.set('xx')
a.set('xe')
a.set('xl')
console.log(a.take(4))
二、优先队列
优先级队列主要考虑的问题为:每个元素不再只是一个数据,还包含数据的优先级;
在添加数据过程中,根据优先级放入到正确位置;
2.1优先级队列的实现
class PriorityQueue {
constructor() {
this.items = []
}
enQueue(name, priority) {
let isAdd = false
for (let i = 0, len = this.items.length; i < len; i++) {
if (priority < this.items[i].priority) {
this.items.splice(i, 0, { name: name, priority: priority })
isAdd = true
break
}
}
if (!isAdd) {
this.items.push({ name: name, priority: priority })
}
}
deQueue() {
return this.items.shift()
}
front() {
return this.items[0]
}
isEmpty() {
return this.items.length === 0
}
size() {
return this.items.length
}
toString() {
return this.items.join(',')
}
}
let s = new PriorityQueue()
s.enQueue('xh', 0)
s.enQueue('xx', 10)
s.enQueue('x2', 120)
s.enQueue('xw', 21)
s.enQueue('xe', 82)
console.log(s.items)
大功告成!