4-1 队列是什么?
- 一个先进先出的数据结构。
- JavaScript 中没有队列,但可以用Array 实现队列的所有功能。
const queue = [];
// 入队
queue.push(1);
queue.push(2);
// 出队
const item1 = queue.shift();
console.log(item1)
const item2 = queue.shift();
4-2 什么场景使用队列?
- 需要先进先出的场景。
- 比如:食堂排队打饭、JS异步中的任务队列、计算最近请求次数。
场景一:食堂排队打饭
- 食堂只留一个窗口,学生排队打饭像春运。
- 先进先出,保证有序。
场景二:JS 异步中的任务队列
- JS 是单线程,无法同时处理异步中的并发任务。
- 使用任务队列先后处理异步任务。
场景三: 计算最近请求次数
- 有新请求就入队,3000ms前发出的请求出队。
- 队列的长度就是最近请求次数。
4-3 LeetCode: 933. 最近的请求次数
题目:
模板:
var RecentCounter = function() {
};
/**
* @param {number} t
* @return {number}
*/
RecentCounter.prototype.ping = function(t) {
};
/**
* Your RecentCounter object will be instantiated and called as such:
* var obj = new RecentCounter()
* var param_1 = obj.ping(t)
*/
解题思路:
越早发出的请求越早不在最近3000ms内的请求里。
解题步骤:
输入:inputs = ["RecentCounter","ping","ping","ping","ping"], inputs = [[],[1],[100],[3001],[3002]]
输出:[null,1,2,3,3]
1.有新请求就入队,3000ms前发出的请求出队。
2.队列的长度就是最近请求次数。
代码实现:
var RecentCounter = function() {
this.q = [];
};
/**
* @param {number} t
* @return {number}
*/
RecentCounter.prototype.ping = function(t) {
this.q.push(t)
while(this.q[0] < t - 3000) {
this.q.shift();
}
return this.q.length;
};
/**
* Your RecentCounter object will be instantiated and called as such:
* var obj = new RecentCounter()
* var param_1 = obj.ping(t)
*/
时间/空间复杂度:O(n)
4-4 JS异步中的任务队列
异步面试题
setTimeout(() => console.log(1), 0);
console.log(2);
//输出 2, 1
JS 中时间循环与队列
解析:
1.图中一共有三部分,第一部分是Callback Queue(任务队列)、第二部分是JS引擎(里面有Heap和Stack,不用理会,整体看成JS引擎即可),第三部分是WebAPI(包括DOM、ajax、setTimeOut)都是用来执行异步任务的。三部分用箭头关联了起来,形成了循环。
2.过程:
- JS 代码刚执行的时候会有一个主事件(匿名)丢到Callback Queue(任务队列)
- JS 引擎到Callback Queue(任务队列)取一个事件执行,JS是单线程,每次只能处理一个事件,在执行的过程中如果有异步任务,就交给webAPI执行(不管了),继续执行后面代码。
- WebAPI在执行异步任务结束时把回调函数的JS代码放到Callback Queue(任务队列)里面,如果任务队列前面的事件执行完了,就把新丢的回调函数代码放到JS引擎里面执行,如果回调函数里面还有异步任务,则继续循环。
面试题讲解:
1.刚执行的时候会有一个主事件放到Callback Queue(任务队列),JS引擎会到任务队列中拿到这个事件执行。
2.执行到setTimeout()时发现这是一个异步任务,交给webAPI执行异步任务,然后继续执行后面代码。
3.然后执行打印2,再执行setTimeout()的回调的打印1。
4-5 队列-章节总结
- 队列是一个先进先出的数据结构。
- JavaScript中没有队列,但可以用Array实现队列的所有功能。
- 队列常用操作:push shift queue[0]