JavaScript数据结构与算法之栈详解


Posted in Javascript onMarch 12, 2015

在上一篇博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈。栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现。

一:对栈的操作。

栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端陈为栈顶。比如餐馆里面洗盘子,只能先洗最上面的盘子,盘子洗完后,也只能螺到这一摞盘子的最上面。栈被称为 "后入先出"(LIFO)的数据结构。

由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问,为了得到栈低的元素,必须先拿掉上面的元素。我们可以对栈的两种主要操作是将一个元素 压入栈 和 将一个元素 弹出栈。入栈我们可以使用方法push()方法,出栈我们使用pop()方法。pop()方法虽然可以访问栈顶的元素,但是调用该方法后,栈顶元素也就从栈中被永久性的删除了。另一个我们很常用的方法是peek(),该方法只返回栈顶元素,而不删除它。

入栈和出栈的实列图如下:

JavaScript数据结构与算法之栈详解

push(),pop()和peek()是栈的三个主要方法,但是栈还有其他方法和属性。如下:

clear():清除栈内的所有元素。

length(): 记录栈内元素的个数。

二:对栈的实现如下:

我们可以先实现栈类的方法开始;如下:
 

  function Stack() {

      this.dataStore = [];

      this.top = 0;

  }

 

 如上:dataStore 是保存栈内的所有元素。变量top记录栈顶的位置,初始化为0. 表示栈顶对应数组的起始位置为0,如果有元素被压入栈。该变量值将随之变化。

我们还有如下几个方法:push(), pop(), peek(),clear(),length();

1.  push()方法;当向栈内压入一个新元素时,需要将其保存在数组中变量top所对应的位置,然后top值加1,让其指向数组中下一个位置。如下代码:

function  push(element) {

     this.dataStore[this.top++] = element;

}

2. pop()方法与push()方法相反---它返回栈顶元素,同时将top值减1.如下代码:
   function pop(){

       return this.dataStore[--this.top];

   }

3. peek()方法返回数组的第top-1个位置的元素,即栈顶元素;
    function peek(){

        return this.dataStore[this.top - 1];

    }

4. length()方法 有时候我们要知道栈内有多少个元素,我们可以通过返回变量top值的方式返回栈内的元素个数,如下代码:
     function length(){

         return this.top;

     }

5. clear(); 有时候我们要清空栈,我们将变量top值设为0;如下代码:
   function clear() {
        this.top = 0;
    }

如下所有代码:
function Stack() {

    this.dataStore = [];

    this.top = 0;

}
Stack.prototype = {

    

    // 向栈中压入一个新元素

    push: function(element) {

        this.dataStore[this.top++] = element;

    },

    // 访问栈顶元素,栈顶元素永久的被删除了

    pop: function(){

        return this.dataStore[--this.top];

    },

    // 返回数组中的 top-1 个位置的元素,即栈顶元素

    peek: function(){

        return this.dataStore[this.top - 1];

    },

    // 栈内存储了多少个元素

    length: function(){

        return this.top;

    },

    // 清空栈

    clear: function(){

        this.top = 0;

    }

};
demo实例如下:
var stack = new Stack();

stack.push("a");

stack.push("b");

stack.push("c");

console.log(stack.length()); // 3

console.log(stack.peek());   // c
var popped = stack.pop();

console.log(popped);  // c
console.log(stack.peek()); // b
stack.push("d");
console.log(stack.peek());  // d
stack.clear();
console.log(stack.length());  // 0
console.log(stack.peek());  // undefined

下面我们可以实现一个阶乘函数的递归定义;比如5!的阶乘 5!= 5 * 4 * 3 * 2 * 1;

如下代码:

function fact(n) {

    var s = new Stack();

    while(n > 1) {

        s.push(n--);

    }

    var product = 1;

    while(s.length() > 0) {

        product *= s.pop();

    }

    return product;

}

console.log(fact(5));

上面的代码含义是:先数字5传入函数,使用while循环,每次自减1的之前,把自己使用栈的函数push()压入栈内,直到变量n  小于 1为止。然后定义一个变量product;通过栈的length()的方法判断是否大于0 且每次执行 product* = s.pop();  pop()方法返回栈顶元素,且从栈中删掉该元素。所以每次执行一次,就删掉一个元素,直到s.length() <= 0 为止。所以 product = 5*4*3*2*1 .等操作。

Javascript 相关文章推荐
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
JS获取各种宽度、高度的简单介绍
Dec 19 Javascript
JavaScript实现MIPS乘法模拟的方法
Apr 17 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
Javascript实现页面滚动时导航智能定位
May 06 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
Oct 09 Javascript
javascript json字符串到json对象转义问题
Jan 22 Javascript
js针对图片加载失败的处理方法分析
Aug 24 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
Nov 26 Javascript
jQuery实现简单的日期输入格式化控件
Mar 12 #Javascript
Javascript数据结构与算法之列表详解
Mar 12 #Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
Mar 12 #Javascript
基于jquery实现的自动补全功能
Mar 12 #Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
Mar 12 #Javascript
window.open()实现post传递参数
Mar 12 #Javascript
js运动动画的八个知识点
Mar 12 #Javascript
You might like
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
js代码实现轮播图
2020/05/04 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python3 queue队列模块详细介绍
2018/01/05 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
中间件分为哪几类
2012/03/14 面试题
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python