队列是什么
一个先进先出的数据结构。它和栈正好是相反的。栈是后进先出。队列是先进先出。 队列比较容易形象的理解。我们排队买东西,就是先排的先买到然后出队。跟程序是一个道理。
JavaScript中也没有队列的数据结构,但是仍然可以用Array去实现队列的所有功能。 push是入队, shift是出队。
const queue = []
queue.push(1)
queue.push(2)
let item1 = queue.shift()
let item2 = queue.shift()
队列的应用场景
面对无法同时处理多个问题的场景,使用先进先出的特性,一个一个解决问题,保证有序性。那么就考虑使用队列。
前端中的js异步任务队列就是典型的队列应用。js是单线程的,无法同时处理异步中的并发任务,就使用了任务队列先后去处理异步任务。
队列经典题目
这是力扣的一个题:
写一个 RecentCounter 类来计算特定时间范围内最近的请求。
请你实现 RecentCounter 类:
RecentCounter() 初始化计数器,请求数为 0 。
int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。 保证 每次对 ping 的调用都使用比之前更大的 t 值。
相信很多人看了一遍之后就问:这TM是什么意思?因为这个题目是翻译过来的,所以比较饶。他的意思就是t表示第n毫秒进来一个请求,让你算出3000毫秒内的请求数。
比如第1ms,100ms, 3000ms,进来三个请求,那么3000ms内就是3个请求,3003ms又进来一个,此时1ms进来的已经不在3000ms统计范围内,所以3003ms时候的请求数仍然是3个
代码:
let RecentCounter = function(){
this.queue = []
}
RecentCounter.prototype.ping = function(t){
this.queue.push(t)
while(this.queue[0]<t - 3000){
this.queue.shift()
}
return this.queue.length
}