js数据结构-队列结构

86 阅读1分钟

队列是一种特殊的线性表,特殊之处在于它值允许在表的前端进行删除操作,在表的后端进行插入操作,和栈一样,队列是一种操作手限制的线性表。

特点:后进先出 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)

你自己喜欢的东西,必须由你自己去摸索寻找。

qdysh.png