模拟红绿灯(递归与队列)
模仿交通信号灯,最简单的处理方式不过是一个简单的递归
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 孙红岩 阅读(...) 评论(...) 编辑 收藏
刷新评论刷新页面返回顶部