JS数据结构与算法知识点--->队列

此数据结构算法知识点系列笔记均是看coderwhy老师视频整理得出!!!

  1. 队列(queue)和栈(stack)都是基于数组的受限的线性结构
  2. 队列的特点是先进先出(FIFO first in first out)
    只能在表的前端进行删除操作,在表的后端进行插入工作。类似于排队。

线程队列

  • 在开发中,为了让任务可以并行处理,通常会开启多个线程
  • 但我们不能让大量的线程同时运行处理任务,这样会占用太多的资源
  • 如果有需要开启线程处理任务的情况,我们就会使用线程队列
  • 线程队列会依照次序来启动线程,并且处理对应的任务。

队列的常见操作

队列有哪些常见的操作呢?

  1. enqueue(element):向队列尾部添加一个(或多个)新的项。
  2. dequeue∶移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
  3. front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。
  4. isEmpty():如果队列中不包含任何元素,返回true,否则返回false.
  5. size():返回队列包含的元素个数,与数组的length属性类似。
  6. toString():将队列中的内容,转成字符串形式

如何实现队列

队列其实基于链表实现性能会更高一些,但是我们目前对数组是比较熟悉的,在此就先以数组进行实现。

    <script>
      // 封装对列类
      function Queue() {
        this.items = [];
        // 1.enqueue 将元素加入到队列中
        Queue.prototype.enqueue = function (ele) {
          this.items.push(ele);
        };
        // 2.dequeue 删除队列中的前端元素
        Queue.prototype.dequeue = function () {
          return this.items.shift();
        };
        // 3.front 查看前端的元素
        Queue.prototype.front = function () {
          return this.items[0];
        };
        // 4.isEmpty
        Queue.prototype.isEmpty = function () {
          return this.items.length == 0;
        };
        // 5.size
        Queue.prototype.size = function () {
          return this.items.length;
        };
        // 6.toString
        Queue.prototype.toString = function () {
            return this.items.join('')
        //   var resultString = "";
        //   for (var i = 0; i < this.items.length; i++) {
        //     resultString += this.items[i] + "";
        //     return resultString;
        //   }
        };
      }
      // 使用队列
      var queue = new Queue();
      queue.enqueue("123");
      queue.enqueue("234");
      queue.enqueue("345");
      console.log(queue); //['123', '234', '345']
      queue.dequeue();
      console.log(queue);// ["234", "345"];
	  console.log(queue.front()); //234
	  console.log(queue.isEmpty());//false
	  console.log(queue.size());//2
	  console.log(queue.toString());//234345
    </script>

面试算法题 击鼓传花

几个朋友一起玩一个游戏,围成一圈,开始数数,数到某个数字的人自动淘汰.最后剩下的这个人会获得胜利,请问最后剩下的是原来在哪一个位置上的人?
在这里插入图片描述

      //实现击鼓传花
      function passGame(nameList, num) {
        // 1.创建一个队列结构
        let queue = new Queue();
        // 2.将所有人依次加入到队列中
        for (let i = 0; i < nameList.length; i++) {
          queue.enqueue(nameList[i]);
        }
        // 3.开始数数字
        while (queue.size() > 1) {
          // 不是num的时候,需要重新加入队列
          // 数到num数字的时候,需要将其在队列中删除

          // 3.1需要将数num数之前的人重新加入到队列中
          for (let i = 0; i < num - 1; i++) {
            queue.enqueue(queue.dequeue());
          }
          // 3.2数到num数对应的这个人直接删点
          queue.dequeue();
        }
        // 4.获取最后剩下的那个人
        let endName = queue.front();
        return nameList.indexOf(endName);
      }

    let namesArr = ['小王','小白','小李','小黑','小赵']
	console.log(passGame(namesArr,3)); //3

优先级队列

优先级队列的特点:

  • 我们知道,普通的队列插入一个元素,数据会被放在后端.并且需要前面所有的元素都处理完成后才会处理后面的数据.
  • 但是优先级队列,在插入一个元素的时候会考虑该
    据的优先级
    .和其他数据优先级进行比较.
  • 比较完成后,可以得出这个元素在队列中正确的位置.
  • 其他处理方式,和基本队列的处理方式一样.

封装优先级队列

      // 优先级队列
      // priority 值越小优先级越高
      function PriorityQueue() {
        function QueueElement(element, priority) {
          this.element = element;
          this.priority = priority;
        }
        // 封装属性
        this.items = [];
        // 实现插入方法
        PriorityQueue.prototype.enqueue = function (element, priority) {
          var queueElement = new QueueElement(element, priority);
          // 判断队列是否为空
          if (this.items.length === 0) {
            // 为空,直接插入
            this.items.push(queueElement);
          } else {
            var 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);
            }
          }
        };
        // 其他方法和普通队列一样
      }

      var priorityQueue = new PriorityQueue();
      priorityQueue.enqueue("123", 12);
      priorityQueue.enqueue("234", 100);
      priorityQueue.enqueue("345", 98);
      priorityQueue.enqueue("456", 2);
      console.log(priorityQueue.items); //[{element: '456', priority: 2}, {element: '123', priority: 12},{element: '345', priority: 98},{element: '234', priority: 100}]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoZai_ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值