04 数据结构之 “队列”

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值