• js实现数据结构


    栈是一种遵从后进先出(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
        })(); 
    
  • 相关阅读:
    C#获取网上图片的宽高代码
    发现两个有趣的CSS3效果
    .NET WinForm画树叶小程序
    生产环境使用 pt-table-checksum 检查MySQL数据一致性【转】
    awk入门【转】
    MySQL数据库之auto_increment【转】
    crontab的使用方法
    linux添加swap分区【转】
    nginx反向代理转发后页面上的js css文件无法加载【原创】
    Serv-U日志文件保存设置【转】
  • 原文地址:https://www.cnblogs.com/honkerzh/p/10552456.html
Copyright © 2020-2023  润新知