天天看点

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

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

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

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 孙红岩 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部