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

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. 代码风格指南

    代码风格指南 js代码风格指南:1.缩进使用空格,不要用制表符2.必须用分号3.暂时不用ES6(modules […]...

  2. nodejs+express+mysql实现接口服务

    跟着课程和文档写的接口服务器,稍微对重点进行了一个总结,完整的项目源码可以戳这里获取项目结构router:存储各个模块的路由router_handler:存储各个模块的处理函数schema:存储各个模块的验证规则utils:封装一些方...

  3. vue+vue-router+vuex实战

    shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代 […]...

  4. webpack必知必会

    细节 url-loader和file-loader是什么关系? file-loader用于将文件路径打包为另一 […]...

  5. 13、Node.js 全局对象

    主要用于调试,显示信息,重点看例子在浏览器 JavaScript 中,通常 window 是全局对象, Nod […]...

  6. 想要学习jQuery却不知从何开始?本文为你精选5个例子帮你快速成为jQuery大师

    本文阅读对象:WEB前端开发初学者、jQuery初学者、JavaScript初学者 本文目的:jQuery真正 […]...

  7. 9.16腾讯web前端开发-2019校园招聘(正式卷)编程题题解(js)

    第一题 和谐的数字 牛牛很喜欢研究数字。一天,他发明了一种数字,叫做“和谐的数字”。 和谐的数字定义如下: 定 […]...

  8. 数据量庞大的分页穿梭框实现

    博客地址:https://ainyi.com/#/63 昨天偶然看到评论区一位老哥的需求,一时兴起,就答应了当 […]...

随机推荐

  1. Windows下安装MongoDB

    Windows下安装MongoDB 首先下载对应版本的MongoDB进行安装,安装时我选择了E盘根目录进行安装 […]...

  2. jQuery的几个小练习

    <!doctype html> <html lang="en"> <head&g […]...

  3. vue-element-admin 全局loading加载等待

    最近遇到需求:   全局加载loading,所有接口都要可以手动控制是否展示加载等待的功能 先去百度一下广大开 […]...

  4. php数据抓取的三种方式

    使用php实现页面数据抓取,这里介绍了三种方法。(fopen、file_get_contents、curl) […]...

  5. Kubernetes上安装KubeSphere

    安装helm 创建helm文件夹,手动下载helm安装包,放入helm文件夹 tar -zxf helm-v3 […]...

  6. python – 怎样使用 requests 模块发送http请求

    最近在学python自动化,怎样用python发起一个http请求呢? 通过了解 request 模块可以帮助 […]...

  7. [杂记]注册电气工程师考试复习及考试杂谈

    今年又到方山晓庄学院陪考注册电气考试。和往年一样,每一年都会有同学来不及赶到考场。如果你要报考2015年考试, […]...

  8. 外包,最好别碰

    从5月16入职外包,到现在已经1个多月的时间了,内心也终于体会到外包人的无奈、无助、孤独、寂寞。本篇文章就和大 […]...

展开目录

目录导航