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 相关文章推荐
js 实现无缝滚动 兼容IE和FF
Jul 15 Javascript
js 获取和设置css3 属性值的实现方法
May 06 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
js中的DOM模拟购物车功能
Mar 22 Javascript
JS正则表达式验证中文字符
May 08 Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
5分钟快速掌握JS中var、let和const的异同
Sep 19 Javascript
使用异步controller与jQuery实现卷帘式分页
Jun 18 jQuery
javascript 数组精简技巧小结
Feb 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具体实现代码
2010/10/12 PHP
php array_map()函数实例用法
2021/03/03 PHP
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
python里对list中的整数求平均并排序
2014/09/12 Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
Python 文件管理实例详解
2015/11/10 Python
python中的for循环
2018/09/28 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
大学专科生推荐信范文
2013/11/23 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
学校门卫岗位职责
2014/03/16 职场文书
语文课外活动总结
2014/08/27 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
周末问候语大全
2015/11/10 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python