1、队列的常见操作
enqueue(element):像队列尾部添加一个(或多个)新的项
dequeue():移除队列的第一(即排在队列的最前面)项。并返回被移除的元素
front():返回队列中第一个元素——最先被添加,也将最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与stack类的peek方法非常类似)
isEmpty():如果队列中不包含任何元素,返回true,否则返回false
size():返回队列包含的元素个数,与数组的length属性类似
2、队列方法的封装
export default class Queue{
constructor(){
this.items=[]
}
//enqueue(element):像队列尾部添加一个(或多个)新的项
enqueue(element){
this.items.push(element)
}
//dequeue():移除队列的第一(即排在队列的最前面)项。并返回被移除的元素
dequeue(){
return this.items.shift()
}
//front():返回队列中第一个元素——最先被添加,也将最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与stack类的peek方法非常类似)
front(){
if(this.isEmpty()) throw new Error('队列为空')
return this.items[0]
}
//isEmpty():如果队列中不包含任何元素,返回true,否则返回false
isEmpty(){
return this.items.length === 0;
}
///size():返回队列包含的元素个数,与数组的length属性类似
size(){
return this.items.length
}
}
测试
import Queue from './queue'
//队列测试
const queue=new Queue()
queue.enqueue('abc')
queue.enqueue('bac')
queue.enqueue('cba')
console.log(queue.items)
console.log(queue.dequeue())
console.log(queue.items)
console.log(queue.front())
console.log(queue.size())
console.log(queue.isEmpty())
结果
3、应用
(1)击鼓传花
击鼓传花封装
import Queue from "./queue";
//击鼓传花的封装
//nameList是名字数组 num表示当报到num数字的人被删除
export default function passGame(nameList,num){
//创建队列
const queue=new Queue()
//把数组加入到队列
for(let i=0;i<nameList.length;i++){
queue.enqueue(nameList[i])
}
//队列循环
while(queue.size()>1){
for(let j=0;j<num-1;j++){
queue.enqueue(queue.dequeue())
}
//删除报到num数字的人
queue.dequeue()
}
return queue.front()
}
测试
//击鼓传花测试
const finallyPerson= passGame(["why","tom","lilei","lucy"],3)
console.log(finallyPerson)
结果
(2)优先级
封装
import Queue from "./queue"
//创建一个包含元素和优先级的对象
class QueueElement{
constructor(element,priority){
this.element=element;
this.priority=priority
}
}
export default class PriorityQueue extends Queue{
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)
}
}
}
}
测试
//优先级测试
const PriorityQueue= new queuePriority()
PriorityQueue.enqueue("aaa",100)
PriorityQueue.enqueue("bbb",160)
PriorityQueue.enqueue("ccc",80)
PriorityQueue.enqueue("ddd",120)
PriorityQueue.enqueue("eee",110)
PriorityQueue.items.forEach((item)=>{
console.log(item.element,item.priority)
})
结果