队列是一种特殊的线性表,特殊之处在于它值允许在表的前端进行删除操作,在表的后端进行插入操作,和栈一样,队列是一种操作手限制的线性表。
特点:后进先出 First in Out first(FIOF)
封装
/*
* Queue 队列
* */
class Queue{
items = []
dequeue(){ // 出队 从队列头部
return this.items.shift()
}
enquene(data){ // 进队 从表尾
this.items.push(data)
}
peek(){ // 返回对头
return this.items.at(0)
}
isEmpty(){ // 判断是不是空
return this.items.length === 0
}
size(){
return this.items.length
}
clear(){ // 清空队列
this.items = []
}
toString(){ // 转成字符串展示出来
return this.items.join(' ')
}
}
let arr = new Queue()
arr.enquene(100)
arr.enquene(200)
arr.enquene(300)
注意:
每次删除数组的第一位,其实对于性能不是很友好的,所以我们换一种结构 也就是对象
/*
* Queue 队列
* */
class Queue{
items = {}
lowCount = 0 ;// 对头的索引
count = 0; // 加了多少值
dequeue(){ // 出队 从队列头部
if(this.isEmpty()){ // 先判断是不是空
return
}
// 先保存再删除
let res = this.items[this.lowCount]
delete this.items[this.lowCount]
this.lowCount++
return res
}
enquene(data){ // 进队 从表尾
this.items[this.count] = data
this.count ++
}
peek(){ // 返回对头
return this.items[this.lowCount]
}
isEmpty(){ // 判断是不是空
return this.size() === 0
}
size(){
return this.count - this.lowCount
}
clear(){ // 清空队列
this.items = {}
}
toString(){ // 转成字符串展示出来
let str = ''
for(let i=0;i<this.size();i++){
str += this.items[this.lowCount+i]
}
return str
}
}
let obj = new Queue()
obj.enquene(100)
obj.enquene(200)
obj.enquene(300)
应用:击鼓传花的小游戏
有5(小1,小2,小3,小4,小5)个人,敲一次鼓传递一下(比如每次都敲7下),循环往复看到最后一次在谁手里,谁出局,直到剩最后一个人为胜利者
function game(list,num){
let queue = new Queue()
for(let i =0 ;i<list.length;i++){
queue.enquene(list[i])
}
// 当循环 >1的时候循环 = 1的时候游戏就结束了
while(queue.size()>1){
for(let i=0;i<num;i++){
// 循环次数
queue.enquene(queue.dequeue())
}
console.log(queue.dequeue(),'淘汰了')
}
}
game(['小明','小红','销量','小郑','小白'],7)
你自己喜欢的东西,必须由你自己去摸索寻找。