今天我们讲讲JavaScript队列数据结构详解。
什么是队列?
队列是一种先进先出的数据结构,队列有两种操作:插入和删除;入队和出队。简单来说就是允许插入的一端称为队尾、允许删除的一端称为队头;
如下图展示了栈这个数据结构:
JavaScript中的队列
要知道JavaScript中没有有关队列的数据模型,因此我们需要通过数组进行模拟,当数组中提供的push()和shift()选项,正好实现先入后出的的操作,
示例代码如下:
const queue = [] // 入队 stack.push(1) stack.push(2) // 出队 const v1 = stack.shift() // 1 const v2 = stack.shift() // 2
JavaScript中的应用场景
队列和栈一样,是算法和程序中最常用的辅助结构,其的应用十分广泛,比如以下场景:
一般都是先进先出,在队列中也是如此。JavaScript中的异步任务队列,异步任务队列是一个典型的应用队列的例子。
最近的请求次数
现在我们就来运用实际,就是933. 最近的请求次数,我们现在要用一个 **** 类来计算特定时间范围内最近的请求。
解题思路如下:
在类中创建一个队列,用于保存最近请求;就可以让ping时保存请求;判断队头请求时间是否比t-3000的时间少,如果是则出队,并继续判断,如果不是则返回队列长度。
实现代码如下:
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 };
补充
概念和结构:
队列是一种先进先出(FIFO)的数据结构。
队列的第一个元素所在位置称为队头,最后一个元素所在位置称为队尾。
不包含任何元素的队列称为空队列。
队列的操作:队列有五种常用操作,分别为:
入队 enqueue(element)
出队 dequeue()
检查队头元素 front()
检查队列是否为空 isEmpty()
获取队列的长度 size()
JS实现:
JS里面的队列结构也是通过数组(Array)来实现的。
function Queue(){ //私有变量不被外界获取 let queue = []; //入队 this.enqueue = function(element){ queue.push(element); } //出队 this.dequeue = function(){ return queue.shift(); } //检查队头元素 this.front = function(){ return queue[0]; } //检查队列是否为空 this.isEmpty = function(){ return queue.length === 0; } //获取队列长度 this.size = function(){ return queue.length; } }
JavaScript队列数据结构详解相关都已讲述完。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/127809.html
摘要:机制详解与中实践应用归纳于笔者的现代开发语法基础与实践技巧系列文章。事件循环机制详解与实践应用是典型的单线程单并发语言,即表示在同一时间片内其只能执行单个任务或者部分代码片。 JavaScript Event Loop 机制详解与 Vue.js 中实践应用归纳于笔者的现代 JavaScript 开发:语法基础与实践技巧系列文章。本文依次介绍了函数调用栈、MacroTask 与 Micr...
摘要:上代码代码可以看出,不仅函数比指定的回调函数先执行,而且函数也比先执行。这是因为后一个事件进入的时候,事件环可能处于不同的阶段导致结果的不确定。这是因为因为执行完后,程序设定了和,因此阶段不会被阻塞进而进入阶段先执行,后进入阶段执行。 JavaScript(简称JS)是前端的首要研究语言,要想真正理解JavaScript就绕不开他的运行机制--Event Loop(事件环) JS是一门...
摘要:中线程运行机制详解对于我们都知道,他是个单线程语言,但是准确来说它是拥有一个执行程序主线程,和消息队列辅线程,以及各个真正处理异步操作的工作线程。 JavaScript中线程运行机制详解 对于JavaScript我们都知道,他是个单线程语言,但是准确来说它是拥有一个执行程序主线程,和消息队列辅线程(Event Loop),以及各个真正处理异步操作的工作线程。当主线程执行JS程序的时候,...
摘要:从异步过程的角度看,函数就是异步过程的发起函数,事件监听函数就是异步过程的回调函数。事件触发时,表示异步任务完成,会将事件监听器函数封装成一条消息放到消息队列中,等待主线程执行。 1.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。JavaScrip...
摘要:主线程在任务队列中读取事件,这个过程是循环不断地,所以这种运行机制叫做事件循环是在执行栈同步代码结束之后,下一次任务队列执行之前。 单线程 javascript为什么是单线程语言,原因在于如果是多线程,当一个线程对DOM节点做添加内容操作的时候,另一个线程要删除这个DOM节点,这个时候,浏览器应该怎么选择,这就造成了混乱,为了解决这类问题,在一开始的时候,javascript就采用单线...
阅读 551·2023-03-27 18:33
阅读 741·2023-03-26 17:27
阅读 633·2023-03-26 17:14
阅读 594·2023-03-17 21:13
阅读 525·2023-03-17 08:28
阅读 1806·2023-02-27 22:32
阅读 1297·2023-02-27 22:27
阅读 2184·2023-01-20 08:28