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 相关文章推荐
使用正则替换变量
May 05 Javascript
JS判断两个时间大小的示例代码
Jan 28 Javascript
jQuery移除元素自动解绑事件实现思路及代码
May 31 Javascript
jquery判断浏览器后退时候弹出消息的方法
Aug 11 Javascript
JS清除选择内容的方法
Jan 29 Javascript
javascript模拟命名空间
Apr 17 Javascript
包含中国城市的javascript对象实例
Aug 03 Javascript
js图片跟随鼠标移动代码
Nov 26 Javascript
BootStrap入门教程(三)之响应式原理
Sep 19 Javascript
Vue表单之v-model绑定下拉列表功能
May 14 Javascript
vue-router之实现导航切换过渡动画效果
Oct 31 Javascript
jquery+ajax实现异步上传文件显示进度条
Aug 17 jQuery
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
星际中的相关伤害
2020/03/04 星际争霸
PHP学习 变量使用总结
2011/03/24 PHP
JQuery循环滚动图片代码
2011/12/08 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
在Python中使用Mako模版库的简单教程
2015/04/08 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
python中二分查找法的实现方法
2020/12/06 Python
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
拆迁委托协议书
2014/09/15 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
销售员岗位职责
2015/02/10 职场文书
步步惊心观后感
2015/06/12 职场文书
python 模块重载的五种方法
2021/04/24 Python
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL
对象析构函数__del__在Python中何时使用
2022/03/22 Python