用js来实现那些数据结构(栈01)

 其实说到底,在js中栈更像是一种变种的数组,只是没有数组那么多的方法,也没有数组那么灵活。但是栈和队列这两种数据结构比数组更加的高效和可控。而在js中要想模拟栈,依据的主要形式也是数组。

  从这篇文章开始,可能会接触到一些原型,原型链,类,构造函数等相关的js概念,但是这里并不会过多的介绍这些概念,必要的时候会进行一些简要的说明,推荐大家去看看

function Stack () {     var items = [];      //首先,我们来实现一个入栈的方法,这个方法负责往栈里加入元素,要注意的是,该方法只能添加元素到栈顶,也就是栈的尾部。    this.push = function (ele) {         items.push(ele)     }  }  var stack = new Stack();
复制代码

  我们声明一个构造函数,并且在构造函数中生命一个私有变量items,作为我们Stack类储存栈元素的基本支持。然后,加入一个push方法,通过this来使其指向调用该方法的实例。下面我们还会通过这样的方式依次添加其他的方法。

复制代码
function Stack () {     var items = [];      //首先,我们来实现一个入栈的方法,这个方法负责往栈里加入元素,要注意的是,该方法只能添加元素到栈顶,也就是栈的尾部。    this.push = function (ele) {         items.push(ele);     }      //然后我们再添加一个出栈的方法,同样的,我们只能移除栈顶的元素。    this.pop = function (ele) {         return items.pop();     }      //查看栈顶,也就是栈的尾部元素是什么    this.peek = function () {         return items[items.length - 1];     }      //检查栈是否为空    this.isEmpty = function () {         return items.length == 0;     }      //检查栈的长度    this.size = function () {         return items.length;     }      //清空栈    this.clear = function () {         items = [];     }      //打印栈内元素    this.print = function () {         console.log(items.toString())     } }
复制代码

  这样我们就通过构造函数完整的创建了一个栈。我们可以通过new命令实例化一个Stack对象来测试一下我们的栈好不好用。

复制代码
var stack = new Stack(); console.log(stack.isEmpty());//truestack.push(1); stack.print(); stack.push(3); stack.print(); console.log(stack.isEmpty());//falseconsole.log(stack.size());//2stack.push(10); stack.print(); stack.pop(); stack.print(); stack.clear(); console.log(stack.isEmpty());//true
复制代码

  我们发现我们的Stack类执行的还算不错。那么还有没有其他的方式可以实现Stack类呢?在ES6之前我可能会遗憾懵懂的对你Say No。但是现在我们可以一起来看看ES6带我们的一些新鲜玩意。

   在开始改造我们的Stack类之前,需要先说一下ES6的几个概念。Class语法Symbol基本类型WeakMap。简单解释一下,以对后面的改造不会一脸懵逼,而大家想要更深入的了解ES6新增的各种语法,可以去自行查阅。

  Class语法简单来说就是一个语法糖,它的功能ES5也是完全可以实现的,只是这样看写起来更加清晰可读,更像是面向对象的语法。

  Symbol是ES6新增的一个基本类型,前面几篇文章说过,ES5只有6中数据类型,但是在ES6中又新增一种数据类型Symbol,它表示独一无二的值。

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信