zoukankan      html  css  js  c++  java
  • 模拟红绿灯(递归与队列)

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

    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(); 
        }
      }
    }
     

    欢迎各大佬指正。。

  • 相关阅读:
    cocos2dx CCSprite自动拉伸全屏
    linux 安装输入法
    linux jdk 配置
    Proguard.cfg 配置
    C++基本概念
    查看android keystore 别名
    view onTouch,onClick,onLongClick
    LiteDB V4.1.4版本 查询日期写法 C#
    解决Highcharts 5.0.7,IE8下bar类型图表无法显示的问题
    AspNetCore AmbiguousMatchException: The request matched multiple endpoints. Matches
  • 原文地址:https://www.cnblogs.com/itstone/p/10566711.html
Copyright © 2011-2022 走看看