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通用函数
May 09 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
JavaScript中使用Substring删除字符串最后一个字符
Nov 03 Javascript
js验证输入是否为手机号码或电话号码示例
Dec 30 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
jquery分割字符串的方法
Jun 24 Javascript
深入理解选择框脚本[推荐]
Dec 13 Javascript
微信小程序 基础组件与导航组件详细介绍
Feb 21 Javascript
Node错误处理笔记之挖坑系列教程
Jun 05 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
Feb 17 Javascript
Vue 中获取当前时间并实时刷新的实现代码
May 12 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
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Python如何读取、写入CSV数据
2020/07/28 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
MYSQL基础面试题
2012/05/13 面试题
Java程序员综合测试题
2014/04/25 面试题
2015年网络管理员工作总结
2015/05/21 职场文书
利用Java连接Hadoop进行编程
2022/06/28 Java/Android