javascript 实现数据结构 - 栈

栈是一种遵从后进先出(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
    })(); 

猜你喜欢

转载自www.cnblogs.com/honkerzh/p/10552456.html