栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。栈就好像是一个底部密封的盒子,我们往里面放东西,最先放进去的东西只能再最上面的东西都取出来之后才能取出,也就是所谓的先进后出。
一、采用构造函数法创建栈
function Stack(){ let items = []; //需要一种数据结构来保存栈里的元素,可以采用数组。 this.push = function (value){//向栈里添加数据 items.push(value); }; this.pop = function(value){//向栈里删除数据 items.pop(value); }; 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()); }; }; let stack1 = new Stack(); console.log(stack1.isEmpty);//true stack1.push(1); stack1.push(2); stack1.print();//1,2
二.优化 - 如何让外界无法访问到items数组,确保栈内数据插入顺序不被破坏。
1.引入WeakMap数据类型,WeakMap为Map的弱类型,必须用键才可以取出值。这些类没有entries、keys和values等迭代器方法,因此,除非你知道键,否则没有办法取出值。
2.闭包。
改写stack构造函数为
let Stack = (function () { const items = new WeakMap(); const weak = {}; return function(){ items.set(weak, []); this.push = function(value){ let arr = items.get(weak); arr.push(value); }; this.print = function(valule){ let arr = items.get(weak); console.log(arr.toString()); } //... 其它函数 }; })(); let stack1 = new Stack(); stack1.push(1); stack1.push(3); stack1.push(5); stack1.print(); //1,3,5
三. ES6语法书写栈
let Stack = (function () { const items = new WeakMap(); const weak = {}; class Stack1 { constructor () { items.set(this, []); }; push(value){ let arr = items.get(this); arr.push(value); }; print(){ let arr = items.get(this); console.log(arr.toString); }; //... 其它函数 } return Stack1 })();
来源:https://www.cnblogs.com/honkerzh/p/10552456.html