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

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

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

欢迎各大佬指正。。

原文地址:https://www.cnblogs.com/itstone/p/10566711.html

时间: 2024-10-09 05:04:15

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

用LinkedList模拟一个堆栈或者队列数据结构 总结: LinkedList知识点

/** 用LinkedList模拟一个堆栈或者队列数据结构. 创建一个堆栈和队列数据结构对象,该对象中使用LinkedList来完成的. 知识点总结: 1.LinkedList特点:链表式数据结构. 重复有序,查询速度慢,增删速度快.不同步的. 2.LinkedList除了实现List接口增删改查的功能外,有一些特有的方法,能够实现在List(列表)的开头和结尾 插入,删除,获取等特有功能.这就是为什么LinkedList能够模拟一个堆栈,或者队列,双端队列的数据结构了. 涉及知识点: 1.什么

使用LinkedList模拟一个堆栈或者队列数据结构

使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList; public class DuiLie { private LinkedList link; public DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public Object

java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

/* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import java.util.*; class DuiLie { private LinkedList link; DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public O

Java LinkedList特有方法程序小解 &amp;&amp; 使用LinkedList 模拟一个堆栈或者队列数据结构。

package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst()/getLast(); removeFirst()/removeLast(); 若链表为空,抛出 没有这个元素异常/NoSuchElementException 但是 JDK1.6 版本以后出现了替代方法: offerFirst()/offerLast(); peekFirst()/peekLas

Java使用LinkedList模拟一个堆栈或者队列数据结构

用Java模拟一个堆栈或者队列数据结构. 首先得明白堆栈和队列的数据结构: 堆栈:先进后出 队列:先进先出 LinkedList中刚好有addFirst()和addLast()方法. [java] view plaincopyprint? public class Stack { public static void main(String[] args) { StackTools tools = new StackTools(); tools.add("a"); tools.add(

【Java学习笔记】&lt;集合框架&gt;使用LinkedList来模拟一个堆栈或者队列的数据结构

1 import java.util.LinkedList; 2 3 public class Test5 { 4 5 public static void main(String[] args) { 6 7 Duilie dl = new Duilie(); 8 9 dl.myAdd("abc1"); 10 dl.myAdd("abc2"); 11 dl.myAdd("abc3"); 12 dl.myAdd("abc4");

leetcode_94题——Binary Tree Inorder Traversal (二叉树,递归,队列queue,)

先采用比较简单的递归的方法来做 #include<iostream> #include<vector> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; //比较简单的递归的方法来做 /*采用递归的方法进行中序遍历,的方法比较简单,不多说了 */ void in

210 - Concurrency Simulator【模拟、双端队列】

没有什么特别的,就是按照题意进行模拟,代码有点长... #include<cstdio> #include<queue> #include<map> #include<cstring> #include<algorithm> using namespace std; const int maxn = 222; int n,t[10],q; int Value[maxn]; /* 1 a = 1 2 print 3 lock 4 unlock 5

poj 2828 buy Tickets 用线段树模拟带插入的队列

Buy Tickets Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2795 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue… The Lunar New