1. 程式人生 > >javascript 實現數據結構 - 棧

javascript 實現數據結構 - 棧

rip 刪除 emp turn 元素 es6語法 this 數組 items

棧是一種遵從後進先出(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
    })(); 

javascript 實現數據結構 - 棧