js队列和堆栈

JS & 事件循环机制、调用栈、堆、主线程、宏任务队列、微任务队列、缓存管理之间的关系 JS 事件循环、异步任务的概念。 阅读详情
在一个博客看到一篇关于堆栈的讲解测试,感觉非常的详细,于是无耻的扒过来收藏了
原文地址:http://www.111cn.net/wy/js-ajax/74924.htm

一、队列和堆栈的简单介绍

1.1、队列的基本概念

队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出!

如下图所示:


1.2、堆栈的基本概念

堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出!

堆是队列优先,先进先出; 栈是先进后出

堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

如下图所示:


二、 在JavaScript中实现队列和堆栈

在JavaScript中实现队列和数组主要是通过数组,js数组中提供了以下几个方法可以让我们很方便实现队列和堆栈:

shift:从数组中把第一个元素删除,并返回这个元素的值。

unshift: 在数组的开头添加一个或更多元素,并返回新的长度

push:在数组的中末尾添加元素,并返回新的长度

pop:从数组中把最后一个元素删除,并返回这个元素的值。

2.1、实现队列

<script type="text/javascript">
        //创建一个数组来模拟队列
        var a=new Array();
        console.log(a);
        //unshift: 在数组的开头添加一个或更多元素,并返回新的长度
        console.log("入队");
        a.unshift(1)
        console.log(a);//----->1
        a.unshift(2);
        console.log(a);//----->2,1
        a.unshift(3);
        console.log(a);//----->3,2,1
        a.unshift(4);
        console.log(a);//----->4,3,2,1
        console.log("出队,先进先出");
        console.log(a);
        //pop:从数组中把最后一个元素删除,并返回这个元素的值
        a.pop();//----->1
        console.log(a);
        a.pop();//----->2
        console.log(a);
        a.pop();//----->3
        console.log(a);
        a.pop();//----->4
        console.log(a);
</script>
在google浏览器控制台输出的效果如下图所示:


2.2、实现堆栈

<script type="text/javascript">
        //创建一个数组来模拟堆栈
        var a=new Array();
        console.log(a);
        //push: 在数组的末尾添加一个或更多元素,并返回新的长度
        console.log("入栈");
        a.push(1)
        console.log(a);//----->1
        a.push(2);
        console.log(a);//----->1,2
        a.push(3);
        console.log(a);//----->1,2,3
        a.push(4);
        console.log(a);//----->1,2,3,4
        console.log("出栈,后进先出");
        console.log(a);
        //pop:从数组中把最后一个元素删除,并返回这个元素的值
        a.pop();//----->4
        console.log(a);
        a.pop();//----->3
        console.log(a);
        a.pop();//----->2
        console.log(a);
        a.pop();//----->1
        console.log(a);
</script>

在google浏览器控制台输出的效果如下图所示:


2.3、push方法和unshift方法的性能测试

Array的push与unshift方法都能给当前数组添加元素,不同的是,push是在末尾添加,而unshift则是在开头添加,从原理就可以知道,unshift的效率是较低的。原因是,它每添加一个元素,都要把现有元素往下移一个位置。但到底效率差异有多大呢?下面来简单测试一下。

<script type="text/javascript">
    /*
    关于代码中"var s=+newDate();"的技巧说明
    解释如下:=+这个运算符是不存在的;
    +相当于.valueOf();
    +new Date()相当于new Date().valueOf()
    //4个结果一样返回当前时间的毫秒数
      alert(+new Date());
      alert(+new Date);
      var s=new Date();
      alert(s.valueOf());
      alert(s.getTime());
    */
    var arr = [ ];
    var startTime = +new Date(); //+new Date()相当于new Date().valueOf(),返回当前时间的毫秒数
     // push性能测试 
     for (var i = 0; i < 100000; i++) { 
       arr.push(i); 
     }
     var endTime = +new Date();
     console.log("调用push方法往数组中添加100000个元素耗时"+(endTime-startTime)+"毫秒"); 
     
     startTime = +new Date(); 
     arr = [ ]; 
     // unshift性能测试 
     for (var i = 0; i < 100000; i++) { 
       arr.unshift(i); 
     }
     endTime = +new Date();
     console.log("调用unshift方法往数组中添加100000个元素耗时"+(endTime-startTime)+"毫秒"); 
</script>

这段代码分别执行了100000次push和unshift操作,在Google浏览器运行一次,得到的结果如下图所示:


可见,unshift比push要慢差不多100倍!因此,平时还是要慎用unshift,特别是对大数组。那如果一定要达到unshift的效果,可以借助于Array的reverse方法,Array的reverse的方法能够把一个数组反转。先把要放进数组的元素用push添加,再执行一次reverse,就达到了unshift的效果。比如:

<script type="text/javascript">
      //创建一个数组来模拟堆栈
        var a=new Array();
        //使用push方法在数组的末尾添加元素
        a.push(1)
        a.push(2);
        a.push(3);
        a.push(4);
        console.log("数组反转之前数组中的元素顺序");
        console.log(a);//----->1,2,3,4
        //Array有一个叫做reverse的方法,能够把一个数组反转。先把要放进数组的元素用push添加,再执行一次reverse,就达到了unshift的效果
        a.reverse();//使用reverse方法将数组进行反转
        console.log("数组反转之后数组中的元素顺序");
        console.log(a);
</script>

在google浏览器控制台输出的效果如下图所示:


从运行结果来看,数组元素的顺序已经反转过来了。

2.4、reverse方法的性能测试

reverse的性能又如何呢,下面再来测试:

<script type="text/javascript">
        var arr = [ ], s = +new Date; 
        for (var i = 0; i < 100000; i++) { 
              arr.push(i); 
        }
        //调用reverse方法将数组里面的100000元素的顺序反转
        arr.reverse(); 
        console.log("调用reverse方法将数组里面的100000元素的顺序反转耗时:"+(+new Date - s)+"毫秒");
</script>

在google浏览器控制台输出的效果如下图所示:


从运行效果中可以看到,reverse方法的性能极高,可以放心使用。

以上就是关于在javascript中通过数组来实现队列和堆栈的总结,并且简单测试了一下push、unshift、reverse这几个方法在操作大数组方面的性能优劣。



Vue3 + 高德地图实现车辆电子围栏监控与报警 通过本文的实现,我们完成了一个通用的车辆电子围栏监控功能:支持多种围栏类型。支持进入/离开/双向报警。使用缓存机制避免重复告警。可与Vue3 + 高德地图无缝集成。在实际项目中,可以结合WebSocket 实时定位,实现车辆的实时监控 + 围栏告警系统🚀。 阅读详情

相关推荐

三维视觉智能焊接系统:免示教技术的工业应用实践

本文深入探讨了三维视觉智能焊接系统中免示教技术的工业应用实践。该系统通过三维视觉相机实时扫描工件,自动识别焊缝并生成轨迹,将产线换型时间从数小时缩短至几分钟,显著提升了生产柔性。文章详细解析了其核心硬件、算法及工厂部署流程,并展望了与数字孪生、工艺智能化融合的未来趋势。

weixin_29091105的博客 432

JavaScript栈和队列

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。**栈的特点是:**先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。栈的受限性体现在只允许在栈顶插入和删除,因此出栈和入栈都是在栈顶。

前端工程师 · Vue 生态深耕者,专注多端与工程化 1423

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 242

JavaScript的堆、栈、队列、事件循环机制

JavaScript的堆、栈、队列、事件循环机制

欢迎访问我的主页:https://www.bookbook.cc 9514

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。

啦啦啦啦 la 1万+

西门子840D新建项目

1、需要一个32位的WIN7或者XP系统,并且已经在系统中安装完成西门子840Dsl开发包和VS2008。(我采用的是XP系统虚拟机) 2、在开始->所有程序找到如下位置 3、在这个位置打开Visual Studio 4、文件->新建->项目 名称和位置都可以随意更改,点击确定。 5、在左侧选择第二个选项进入下面的界面 点击“Add Screen”按钮 可以修改“class name”然后点击“OK”返回上一个界面,再点击“Add Form” 可以修...

qq_36987047的博客 1861

简单理解js栈、堆、队列

简单理解js栈、堆、队列

瘦瘦瘦大人的博客 722

Blender.粒子效果

Blender.粒子效果 ✦ shift+A新建一个棱角球,细分(之后要分解成许多小颗粒) ✦ 给球添加粒子系统,这时播放粒子会向下掉,力场权重☛重力☛0后,粒子会在球体周围运动 ✦ shift+A添加一个力场,调整力场强度 ✦如果粒子运动太快,我们可以在输出属性中调整时间重映射的原始值 ✦想让粒子在球周围运动而不是发散出去,在物理属性找到力场设置,调整流的大小 ✦S键将球形缩小到看不见 ✦给粒子变添加立方体的形状,在粒子属性里找到渲染选项,将“光晕”改为“物体”,在实例物体中选择新建的立方

weixin_46385629的博客 6669

js 中堆、栈、队列+宏任务+微任务+web workers

js 中堆、栈、队列+宏任务+微任务+web workers

m0_51244077的博客 1337

2026 年 3 月青少年软编等考 C/C++ 三级测试题解析

摘要 本文包含三部分内容: 单选题(10题):考察C++基础语法和数据结构知识,涉及vector、栈、队列的操作和特性。 判断题(10题):测试对动态数组、栈、队列、字符串操作的理解,包括内存管理、访问方式和函数返回值等。 编程题(1题):模拟火车站售票窗口排队场景,要求根据输入输出各窗口的排队情况,重点考查队列的实际应用和边界条件处理。 答案解析详细,涵盖常见编程考点,适合检验基础知识的掌握程度。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 251

基于遗传算法的码头泊位分配调度优化问题求解

例如,基因型为 [3, 1, 4, 2] 表示第一艘停靠在第三个泊位,第二艘停靠在第一个泊位,以此类推。同时,该码头有 n 艘船需要停靠,每艘船的货物数量、船长、船宽都不同,需要根据其特性来分配合适的泊位,并确定每个泊位的使用时间,以最大化码头的使用效率。码头的泊位分配调度是一个关键的物流问题,它涉及到船舶的进出港、货物的装卸和存储等多个方面,因此对其进行优化是至关重要的。根据得到的最优个体,可以得到每个泊位停靠的船只、使用时间等信息,从而确定码头的泊位分配调度方案。% 不同船只的货物数量。

uote_e的博客 1075

使用js数组模拟队列和堆栈

使用js数组模拟队列和堆栈

weixin_43912756的博客 312

华为OD机试真题 新系统【进制转换后自定义排序】

华为OD机试 新系统真题【进制转换后自定义排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【进制转换后自定义排序】多语言题解。

qq_45776114的博客 594

JS数组实现队列和堆栈

JS分别为队列和堆栈的实现提供了两个函数。 队列实现: shift() : 删除集合中第一个元素,并返回这个元素的值 unshift() :在集合开头添加新元素(一个或多个均可),并返回新的集合的长度 堆栈实现: pop() :删除集合的最后一个元素,并返回元素的值 push() :将元素添加到集合的结尾

code_better的博客 2429

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

如何在JavaScript中实现堆栈和队列?

What is the best way to implement a Stack and a Queue in JavaScript? 在JavaScript中实现Stack和Queue的最佳方法

asdfgh0077的博客 258

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

php数组实现堆栈的三个函数,深入详解JavaScript数组的堆栈和队列的操作方法

堆栈和队列要了解JavaScript数组的堆栈和队列方法的操作,需要先对堆栈和队列基础知识有所了解。在继续后面的内容之前,我们先简单的了解一下堆栈和队列的概念。栈和队列都是动态的集合,在栈中,可以去掉的元素是最近插入的那一个。栈实现了后进先出。在队列中,可以去掉的元素总是在集合中存在的时间最长的那一个。队列实现了先进先出的策略。堆栈的基本概念图示:栈是一种LIFO(Last-In-First-Ou...

weixin_36364419的博客 209

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

通过JavaScript探索堆栈和队列

javascript 堆栈Very often, a fully decked-out doubly linked list may just be overkill for what you’re trying to achieve. In this article, we’re going to explore two extremely common minimalist variation...

214

js:堆栈和队列

JavaScript数组的栈和队列的操作方法。 堆栈和队列 要了解JavaScript数组的堆栈和队列方法的操作,需要先对堆栈和队列基础知识有所了解。在继续后面的内容之前,我们先简单的了解一下堆栈和队列的概念。 栈和队列都是动态的集合,在栈中,可以去掉的元素是最近插入的那一个。栈实现了后进先出。在队列中,可以去掉的元素总是在集合中存在的时间最长的那一个。队列实现了先进先出的策略。 堆栈的基...

weixin_38383877的博客 1万+

使用JavaScript的数据结构:堆栈和队列

您将要创造的 Web开发中最常用的两个数据结构是堆栈和队列。 Internet的许多用户,包括Web开发人员,都没有意识到这一惊人的事实。 如果您是这些开发人员之一,那么请准备两个启发性的示例:文本编辑器的“撤消”操作使用堆栈来组织数据; Web浏览器的事件循环(用于处理事件(点击,悬停等))使用队列来处理数据。 现在暂停片刻,想象一下作为用户和开发人员,我们使用堆栈和队列的次数。 太神...

代码教主 341

javascript的数组实现数据结构中的堆栈和队列

简单的利用javascript的数组实现数据结构中的堆栈和队列。Stack.js源码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

dd201105064328的博客 264

线性结构循环队列_线性数据结构:JS中的链接列表,堆栈和队列

线性结构循环队列by Yung L. Leung 梁永良 线性数据结构:JS中的链接列表,堆栈和队列 (Linear Data Structures: Linked Lists, Stacks, and Queues in JS) Building from Simple Algorithms & Data Structures in JS, here we’ll look at da...

cumian8165的博客 203

JavaScript学习笔记之 数组方法一 堆栈 和队列

数组的方法 以及 堆栈的操作的方法 JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型。在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操作数组(比如删除当前项,则所有之后的数组元素下标都将向前移动)是一件很危险的事情。 JavaScript的数组是一个拥有堆栈和队列自身优点的global对象。也就是说JavaScript数组可以表...

weixin_30448603的博客 186

JavaScript实现数据结构中的队列和堆栈

1、队列的基本概念   队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出!(可以想象成水管)   如下图所示:    2、堆栈的基本概念   堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出!(可以想象成木桶)   如下图所示:    二、 在JavaScript中实现队列和堆栈   在JavaScr

qq_24193261的博客 290

c语言堆栈基本代码入栈出栈_深入详解JavaScript数组的堆栈和队列的操作方法

堆栈和队列要了解JavaScript数组的堆栈和队列方法的操作,需要先对堆栈和队列基础知识有所了解。在继续后面的内容之前,我们先简单的了解一下堆栈和队列的概念。栈和队列都是动态的集合,在栈中,可以去掉的元素是最近插入的那一个。栈实现了后进先出。在队列中,可以去掉的元素总是在集合中存在的时间最长的那一个。队列实现了先进先出的策略。堆栈的基本概念图示:栈是一种LIFO(Last-In-First-Ou...

weixin_32578161的博客 245

JS 堆栈事件调用(同步调用、异步调用);消息队列和作业队列

同步调用 const bar = () => console.log('bar') const baz = () => console.log('baz') const foo = () => { console.log('foo') bar() baz() } foo() 代码会打印出 foo bar baz 调用堆栈: 异步调用 const bar = () => console.log('bar') const baz = () => console.l

FengChen的进阶之路 561

JS队列与堆栈的方法

在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法,而对于JS来说,我们可以实现数组的相关操作,来实现队列和堆栈的功能,看下面的相关介绍. 一、看一下它们的性质,这种性质决定了它们的使用场合 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出! 堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出! 二、看一下实现的代码(JS代码) var a=new Array(); a.unshift(1); a.unshift(2); a.u

weixin_51109349的博客 232
上一篇: js正则表达式
下一篇: Js数组的操作push,pop,shift,unshift等方法
阿榄
博客等级 码龄18年 31粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值