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

itstone 2019-03-20 原文

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

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

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

欢迎各大佬指正。。

 

发表于 2019-03-20 18:18 孙红岩 阅读() 评论() 编辑 收藏

 

版权声明:本文为itstone原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/itstone/p/10566711.html

模拟红绿灯(递归与队列)的更多相关文章

  1. react+nodejs+mysql实现管理系统

    引言本项目是跟着b站一个视频做的新闻管理系统,原视频没有做后端部分。我在此基础上自己构建了数据库,写了接口服务,同时对原本的页面展示进行了部分修改。另外,原视频用的是redux管理状态,本项目用的是mobx。项目的所有源码都在githu...

  2. javascript

    基础语法注释数据类型Number字符串布尔值&&运算是与运算||运算是或运算!运算是非运算比较运算符变量var声明作用域函数基础语法注释// 这是一行注释alert('hello'); // 这也是注释数据类型Numb...

  3. 数据结构之Stack | 让我们一块来学习数据结构

    栈的介绍 栈就是和列表类似的一种数据结构,它可用来解决计算机世界里的很多问题。栈是一种高 效的数据结构,因为数 […]...

  4. nodejs 安装篇

    直接使用ubuntu软件源安装sudo apt update sudo apt install nodejs npm nodejs --version v10.19.0 npm -v从nodesource安装nodejs和npm复制代码安...

  5. Javascript条件语句

    Javascript条件语句之if else1 2 3 4 5 hello world...

  6. NodeJS 连接 Redis 读写操作

    一、Redis 基础Redis 可以说是最最最简单的数据库了。大部分数据库的读写操作都是在硬盘上的,而 Redis 是在内存上的。所以读写速度会比其他传统数据库要快。但缺点是数据不能持久化,一旦断电重启,数据就没了。当然,Redis 也...

  7. Javascript 装饰器极速指南

    pablo.png Decorators 是ES7中添加的JavaScript新特性。熟悉Typescript […]...

  8. 谈谈Javascript异步代码优化

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 在实际编码 […]...

随机推荐

  1. 国内主流云主机比较

    随着国内云主机技术日趋成熟,云主机的优势越来越明显,用户对云主机的态度也由观望变为乐于尝试。国内各大云主机商也 […]...

  2. 酱油

    酱油 全国大学生信息安全竞赛校内选拔赛     为了普及信息安全知识,培养大学生的创新意识,团队合作精神,提高 […]...

  3. MySQL之多表查询

    阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍   本节主题 […]...

  4. Spring中老生常谈的FactoryBean

    本文完整代码地址:https://github.com/yu-linfeng/BlogRepositories […]...

  5. asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别 (转)

    首先,MVC和三层架构,是不一样的。  三层架构中,DAL(数据访问层)、BLL(业务逻辑层)、WEB层各司其 […]...

  6. 一次通过国家软考信息系统项目管理师的心得体会

        2009年7月20日工业和信息化部教育与考试中心(全国软考办)公布了2009年上半年计算机技术与软件专 […]...

  7. java读取中文乱码解决方法

    Java读取文本文件(例如csv文件、txt文件等),遇到中文就变成乱码。读取代码如下: List<St […]...

  8. SecureCRT的安装、介绍、简单操作 – 小菜的爱

    SecureCRT的安装、介绍、简单操作 网上看到一篇名为《SecureCRT的使用方法和技巧(详细使用教程) […]...

展开目录

目录导航