队列知识点笔记

队列

1. 定义

image-20210819072706084

image-20210819072839661

image-20210920230043723

2. 队列的顺序存储结构
  • 代码实现
// 队列的封装
  function Queue() {
    // 属性
    this.items = []
    // 方法
    // 1. 加入队列
   Queue.prototype.enqueue = function (element) {
      this.items.push(element)
   }
    // 2. 删除队列前端元素
    Queue.prototype.dequeue = function () {
      // this.items.pop() pop是从尾取元素
      return this.items.shift()
    }
    // 3. 查看队列是否为空
    Queue.prototype.isEmpty = function () {
      return this.items.length == 0
    }
    // 4. 查看队列前端元素
    Queue.prototype.front = function () {
      return this.items[0]
    }
    // 5. 查看队列中元素的个数
    Queue.prototype.size = function () {
      return this.items.length
    }
    // 6. toString方法
    Queue.prototype.toString = function () {
      var queueString = ''
      for (var i = 0;i < this.items.length; i++) {
        queueString += this.items[i] + ' '
      }
      return queueString
    }

  }

  • 测试
  // 测试队列
  var queue = new Queue()
  // 加入元素中
  queue.enqueue(12)
  queue.enqueue('adf')
  queue.enqueue(23)
  queue.enqueue(30)
  // toString
  alert(queue.toString())
  // 移除队列第一
  queue.dequeue()
  alert(queue.toString())
  // 获得第一个元素,不做任何操作
  alert(queue.front())
  alert(queue.toString())
  // 判断是否为
  alert(queue.isEmpty())
  // 获取队列的元素个数
  alert(queue.size())
3. 队列的链式存储结构

队列的链式存储结构,就是线性表的单链表,只是它只能尾进头出

4.优先级队列

如何根据插入数据的 优先级以及数据,判断插入的位置

  • 优先级队列的生活应用:
    • 头等舱和商务舱乘客的优先级高于经济舱
    • 老年人、孕妇、小孩登机优先级高于其他乘客
    • 操作系统的进程,按照队列优先级进行处理
    • 医院病情的处理顺序
  1. 优先级队列定义

    通过一个数组,存放内部类(含优先级、数据)的数据结构

  2. 代码实现

      // 封装优先级队列 priority queue
      function priorityQueue() {
    
        // 在 priorityQueue 中创建一个类,封装内部类,用于存放数据和优先级
        function QueueElement(element,priority) {
          this.element = element
          this.priority = priority
        }
    
        // 封装属性
        this.items = []
    
        // 1. 实现插入方法
        priorityQueue.prototype.enqueue = function (element,priority) {
          // 1.创建 QueueElement 对象
          var queueElement = new QueueElement(element,priority)
    
          // 2.判断队列是否为空
          if (this.items.length == 0) {
            // 为空,则没有数据,直接 push 进入
            this.items.push(queueElement)
          } else {
            // 标识是否在中间插入数据,是则置为 true,否则反之
            var added = false
            for (var 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)
            }
          }
        }
    
        // 2. 删除队列前端元素
        priorityQueue.prototype.dequeue = function () {
          // this.items.pop() pop是从尾取元素
          return this.items.shift()
        }
        // 3. 查看队列是否为空
        priorityQueue.prototype.isEmpty = function () {
          return this.items.length == 0
        }
        // 4. 查看队列前端元素
        priorityQueue.prototype.front = function () {
          return this.items[0]
        }
        // 5. 查看队列中元素的个数
        priorityQueue.prototype.size = function () {
          return this.items.length
        }
        // 6. toString方法
        priorityQueue.prototype.toString = function () {
          var queueString = ''
          for (var i = 0;i < this.items.length; i++) {
            queueString += this.items[i].element + '_' + this.items[i].priority + ' '
          }
          return queueString
        }
    
      }
    
      // 测试代码
      var pQ = new priorityQueue()
      pQ.enqueue('abc',111)
      pQ.enqueue('cba',200)
      pQ.enqueue('nbc',50)
      pQ.enqueue('LHH',999)
      pQ.enqueue('TR',99)
      // 这个说明什么:alert(pQ)、和alert(pQ.toString()) 一个道理
      alert("测试: "+pQ.toString())
      alert(pQ)
    
    
5. 队列的运用
1. 击鼓传花

简单说明:运用队列的特性,将所有元素入队,再根据逢5则出队,最终只剩一个元素

图示:

image-20210920231841112

2. 实现代码
  // 面试题:击鼓传花
  // nameList 数组,num 待删除的编号
  function passGame(nameList,num) {
    // 1. 创建一个队列
    var queue = new Queue()

    // 2. 将所有人依次加入到队列中
    for (var i = 0; i < nameList.length; i++) {
      queue.enqueue(nameList[i])
    }

    // 3. 开始数数字
    while (queue.size() > 1) {
      // 不是 num 的时候,重新加入队列的尾
      // 是 num 这个数字的时候,将其从队列中删除
      // 3.1 num 数字之前的人重新放入队列尾
      for (var i = 0; i < num - 1; i++) {
        queue.enqueue(queue.dequeue())
      }
      // 3.2 num 对应这个人,直接从队列中删除掉
      queue.dequeue()
    }
    // 4. 获取剩下的那个人
    alert(queue.size())
    var endName = queue.front()
    alert("最终剩下的人:"+ endName)
    // 获取该数组的下标
    return nameList.indexOf(endName)
  }
// 测试
  var nameList = ['宋小宝','宋铁','宋仁宗','送西瓜','送冬瓜','宋明珠']
  var num = 5
  alert("返回的下标"+this.passGame(nameList,num))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值