js高級進階之數據結構“棧”es5和es6的實現及應用

對程序員來說棧結構最爲熟悉的一種數據結構,其特點是遵從後進先出(LIFO——Last In First Out)原則,新添加或待刪除的元素保存在棧的同一端,稱作棧頂,另一端稱作棧底。在棧中,新元素總是靠近棧頂,而舊元素總是接近棧底。
js實現棧數據結構也相對簡單

es5實現棧結構

        /**
         * stack類
         * */
        function Stack() {
            this.items = [];  
        }

        Stack.prototype={
            // 向棧添加新元素
            push : function (element) {
                this.items.push(element);
            },

            // 從棧內彈出一個元素
            pop : function () {
                return this.items.pop();
            },

            // 返回棧頂的元素
            peek : function () {
                return this.items[this.items.length - 1];
            },

            // 判斷棧是否爲空
            isEmpty : function () {
                return this.items.length === 0;
            },

            // 返回棧的長度
            size : function () {
                return this.items.length;
            },

            // 清空棧
            clear : function () {
                this.items = [];
            },

            // 打印棧內的所有元素
            print : function () {
                console.log(this.items.toString());
            }
        }

測試:

 //------------------測試-----------------

        let stack = new Stack();
        console.log(stack.isEmpty()); // true
        //測試數組
        let testArry = [1,2,3,4,5]

        //入棧
        testArry.forEach(v=>{
            stack.push(v);
        })
        console.log(stack.isEmpty()); // false
        stack.print();

        console.log(stack.peek()); // 5

        console.log(stack.size()); // 5
 
        stack.pop();

        console.log(stack.size()); // 4
        stack.print(); //1,2,3,4

        stack.clear();
        console.log(stack.size()); // 0
        stack.print(); 

結果:
在這裏插入圖片描述

es6實現:

let Stack = (function () {
            const items = new WeakMap();
            class Stack {
                constructor () {
                    items.set(this, []);
                }

                push(element) {
                    let s = items.get(this);
                    s.push(element);
                }

                pop() {
                    let s = items.get(this);
                    return s.pop();
                }

                peek() {
                    let s = items.get(this);
                    return s[s.length - 1];
                }

                isEmpty() {
                    return items.get(this).length === 0;
                }

                size() {
                    return items.get(this).length;
                }

                clear() {
                    items.set(this, []);
                }

                print() {
                    console.log(items.get(this).toString());
                }
            }
            return Stack;
        })();
發佈了77 篇原創文章 · 獲贊 8 · 訪問量 6879
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章