• 模拟红绿灯(递归与队列)


    模仿交通信号灯,最简单的处理方式不过是一个简单的递归

    function traffic(num) {
      var signal = ['红', '黄', '蓝'];
      num = num < (signal.length - 1) ? (num + 1) : 0;
      setTimeout(() => {
        console.log(signal[num]);
        deng(num);
      }, 1000);
    }

    非常简单的一个功能,突然想到了队列的先进后出,蛮可以用队列的方式再升级一下,顺便巩固下队列的知识

    创建队列

    let Queue = (function () {
      const items = new WeakMap();//WeakMap对象是密钥/值对的集合,其中密钥被弱引用。键必须是对象,值可以是任意值。
    
      class Queue {
        constructor() {
          items.set(this, []);
        }
        enqueue(...element) {//向队列尾部添加一个(或多个)新的项
          let q = items.get(this);
          q.push(...element);
        }
        dequeue() {//移除队列的第一个(排在队列最前面的)项,并返回被移除的元素。
          let q = items.get(this);
          let r = q.shift();
          return r;
        }
        front() {//返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息)
          let q = items.get(this);
          return q[0];
        }
        isEmpty() {//如果队列中不包含任何元素,返回true,否则返回false。
          return items.get(this).length == 0;
        }
        size() {//返回队列包含的元素个数,与数组的length属性类似。
          let q = items.get(this);
          return q.length;
        }
        clear() {//清空队列里面的元素。
          items.set(this, []);
        }
        print() {//打印队列为String到控制台
          console.log(this.toString());
        }
        toString() {//输出队列以String模式。
          return items.get(this).toString();
        }
      }
      return Queue;
    })();

    npm上其实是有现成的代码的,可以直接 npm install queue

    定义好了队列,调用的时候有一个小技术点,就是当for遇到了setTimeout

    let sleep = ()=>{
          return new Promise((resolve,reject)=>{
            setTimeout(() => { 
              resolve();
            }, 1000);
          });
    }

    多年烂大街的面试题,其实就这么一个就解决了。。。

    最终的调用

     async function traffic(nameList, num) {
      let queue = new Queue();
      for (let i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i]);
      } 
      while (queue.size() > 1) {
        for (let i = 0; i < num; i++) {
          let key = queue.dequeue();
          console.log(key);
          queue.enqueue(key);
           await sleep(); 
        }
      }
    }
     

    欢迎各大佬指正。。

  • 相关阅读:
    C# partial 作用
    C#中internal关键字是什么意思?什么叫做“只能在包含它的程序集中访问该方法”
    [转]利用.NET中的反射机制实现IList到DataTable的转换
    你可能已经知道或者不知道的ASP.NET 2.0技巧
    SQL Server基本函数详细介绍--字符串函数
    在Web.config配置文件中自定义配置节点
    SQL SERVER事务处理
    专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
    SQL SERVER 高效存储过程分页(Max/Min方法)
    该字符串未被识别为有效的 DateTime
  • 原文地址:https://www.cnblogs.com/itstone/p/10566711.html
Copyright © 2020-2023  润新知