二、数据结构(队列)

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)

})

结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值