JavaScript的数组实现队列与堆栈的方法

今天在项目中要使用JavaScript实现数据结构中的队列和堆栈,这里做一下总结。

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

1.1、队列的基本概念

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

如下图所示:

1.2、堆栈的基本概念

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

如下图所示:

二、 在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这几个方法在操作大数组方面的性能优劣。

时间: 2024-09-16 19:13:01

JavaScript的数组实现队列与堆栈的方法的相关文章

JS实现队列与堆栈的方法_javascript技巧

本文实例讲述了JS实现队列与堆栈的方法.分享给大家供大家参考,具体如下: 在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法,而对于JS来说,我们可以实现数组的相关操作,来实现队列和堆栈的功能,看下面的相关介绍. 一.看一下它们的性质,这种性质决定了它们的使用场合 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出! 堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出! 二.看一下实现的代码(JS代码) var a=new

JavaScript判断数组是否包含指定元素的方法

  本文实例讲述了JavaScript判断数组是否包含指定元素的方法.分享给大家供大家参考.具体如下: 这段代码通过prototype定义了数组方法,这样就可以在任意数组调用contains方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 /** * Array.prototype.[method name] allows you to define/overwrite an objects method * needle is the item you are searching

JavaScript将数组转换成CSV格式的方法

 这篇文章主要介绍了JavaScript将数组转换成CSV格式的方法,实例分析了javascript使用valueOf方法将数组值转换为csv格式字符串的技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了JavaScript将数组转换成CSV格式的方法.分享给大家供大家参考.具体分析如下: JavaScript中数组对象的valueOf方法可以将数组的值输出为逗号分割的字符串,下面的代码演示了如何将数组抓换成逗号和竖线分割的字符串 ? 1 2 3 4 var fruits =

JavaScript判断数组重复内容的两种方法(推荐)_javascript技巧

前言 一般,我们可能会给数组去重,这个操作并不复杂,执行一个循环就是了.现在,我要做的是,判断数组中是否有重复的内容,如果有,返回 true 否则,返回 false. 思路 把数组变成字符串 循环原数组,拿每一个字段和这个字符串进行比对,看是否有重复 如何拿A字符串和B字符串进行对比,并且要求判断出B字符串中包含过个A字符串呢? 方法一 indexOf() 和 lastIndexOf() 对比法. 首先,我们构建代码: var arr = ["aa","bb",&q

JavaScript中数组去除重复的三种方法_javascript技巧

废话不多说了,具体方法如下所示: 方法一:返回新数组每个位子类型没变 function outRepeat(a){ var hash=[],arr=[]; for (var i = 0; i < a.length; i++) { hash[a[i]]!=null; if(!hash[a[i]]){ arr.push(a[i]); hash[a[i]]=true; } } console.log(arr); } outRepeat([2,4,4,5,"a","a"

JavaScript判断数组是否包含指定元素的方法_javascript技巧

本文实例讲述了JavaScript判断数组是否包含指定元素的方法.分享给大家供大家参考.具体如下: 这段代码通过prototype定义了数组方法,这样就可以在任意数组调用contains方法 /** * Array.prototype.[method name] allows you to define/overwrite an objects method * needle is the item you are searching for * this is a special variab

JavaScript将数组转换成CSV格式的方法_javascript技巧

本文实例讲述了JavaScript将数组转换成CSV格式的方法.分享给大家供大家参考.具体分析如下: JavaScript中数组对象的valueOf方法可以将数组的值输出为逗号分割的字符串,下面的代码演示了如何将数组抓换成逗号和竖线分割的字符串 var fruits = ['apple', 'peaches', 'oranges', 'mangoes']; var str = fruits.valueOf(); //输出结果: apple,peaches,oranges,mangoes 如果希望

Go语言的队列和堆栈实现方法_Golang

本文实例讲述了Go语言的队列和堆栈实现方法.分享给大家供大家参考.具体如下: golang,其实我的实现是利用container/list包实现的,其实container/list包很强大. 复制代码 代码如下: package main import (     "fmt"     "container/list" ) func main() {     // 生成队列     l := list.New()     // 入队, 压栈     l.PushBac

JavaScript中数组对象的那些自带方法介绍_javascript技巧

/** * 本文纯粹是梳理一下目前W3C标准中Array对象的自带Method. * 全文没啥营养,不过最后性能测试的部分,倒是抛出了一些疑问. */ 赋值方法 (Mutator methods) 这些方法直接修改数组自身 pop 和 push Array.pop(); // 删除数组最后一个元素,返回被删除的元素 Array.push(element1, ..., elementN); // 在数组尾部插入1-N个元素,返回操作后数组的length 通过这 pop 和 push ,就能把数组模