队列结构(Queue)
是一种受限的线性表,先进先出(FIFO)
- 限制是:仅在表的前端进行删除操作
- 仅在表的后端进行插入操作
代码
常见实现方式:
- 基于数组
- 基于链表
- 数组
function Queue() {
console.log('this', this) //Queue对象
//属性
this.items = []
//插入
Queue.prototype.enqueue = function (ele) {
this.items.push(ele)
}
//删除前端元素
Queue.prototype.dequeue = function () {
return this.items.shift()
}
//查看前端元素
Queue.prototype.front = function () {
return this.items[0]
}
//isEmpty :查看队列是否为空
Queue.prototype.isEmpty = function () {
return this.items.length === 0
}
// size() :返回队列的元素个数
Queue.prototype.size = function (ele) {
return this.items.length
}
//toString() :将队列的内容以字符形式返回
Queue.prototype.toString = function (ele) {
let resultString = ''
for (let i = 0; i < this.items.length; i++) {
resultString += this.items[i] + ' '
}
return resultString
}
}
测试
let queue = new Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
console.log('queue', queue)
console.log('queue.dequeue()', queue.dequeue())
console.log('queue.front()', queue.front())
console.log('queue.isEmpty()', queue.isEmpty())
console.log('queue.size()', queue.size())
console.log('queue.toString()', queue.toString())
测试结果
应用
击鼓传花
function passGame(numList, num) {
let queue = new Queue()
//将数组存入队列
for (let i = 0; i < numList.length; i++) {
queue.enqueue(numList[i])
}
//获取最后剩余的参数
while (queue.size() > 1) {
for (let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
queue.dequeue()
}
//获取该参数的下标
let index = numList.indexOf(queue.front())
console.log('index', index)
}
passGame([1, 2, 3, 4, 5, 6, 7, 8], 5)
优先级队列
插入元素时,考虑该数据的优先级,把该数据和其他数据优先级进行比较,最后得出这个元素在队列中的正确位置
代码
function PriorityQueue() {
function QueueElement(ele, pri) {
this.ele = ele
this.pri = pri
}
//属性
this.items = []
//插入
PriorityQueue.prototype.enqueue = function (ele, pri) {
// 创建PriorityQueue对象
let queueElement = new QueueElement(ele, pri)
//如果队列为空
if (this.items.length === 0) {
this.items.push(queueElement)
} else {
let add = false
for (let i = 0; i < this.items.length; i++) {
if (queueElement.pri < this.items[i].pri) {
this.items.splice(i, 0, queueElement)
add = true
break
}
}
if (!add) {
this.items.push(queueElement)
}
}
}
//删除前端元素
PriorityQueue.prototype.dequeue = function () {
return this.items.shift()
}
//查看前端元素
PriorityQueue.prototype.front = function () {
return this.items[0]
}
//isEmpty :查看队列是否为空
PriorityQueue.prototype.isEmpty = function () {
return this.items.length === 0
}
// size() :返回队列的元素个数
PriorityQueue.prototype.size = function (ele) {
return this.items.length
}
//toString() :将队列的内容以字符形式返回
PriorityQueue.prototype.toString = function (ele) {
let resultString = ''
for (let i = 0; i < this.items.length; i++) {
resultString += this.items[i].ele + ' ' + this.items[i].pri + ', '
}
return resultString
}
}
测试
let pq = new PriorityQueue()
pq.enqueue(1, 100)
pq.enqueue(2, 101)
pq.enqueue(3, 102)
pq.enqueue(4, 99)
console.log('pq', pq)
console.log('pq.toString()', pq.toString())
console.log('pq.dequeue()', pq.dequeue())
console.log('pq.front()', pq.front())
console.log('pq.isEmpty()', pq.isEmpty())
console.log('pq.size()', pq.size())
console.log('pq.toString()', pq.toString())
测试结果