资讯专栏INFORMATION COLUMN

《JavaScript数据结构与算法》笔记——第3章 栈

cyqian / 1271人阅读

摘要:栈是一种后进先出的有序集合函数创建栈各种属性和方法的声明需要一种数据结构来保存栈里的元素为栈声明一些方法添加一个或者几个新元素到栈顶移出栈顶的元素,同时返回被移出的元素返回栈顶的元素,不对栈做任何修改如果栈里没有任何元素就返回,否则返回移

栈是一种后进先出(LIFO)的有序集合

函数创建栈

function Stack() {
    // 各种属性和方法的声明
    item = [];// 需要一种数据结构来保存栈里的元素
    // 为栈声明一些方法
    /**
     * 添加一个或者几个新元素到栈顶
     * @param element
     */
    this.push = function (element) {
        item.push(element)
    };
    /**
     * 移出栈顶的元素,同时返回被移出的元素
     * @returns {*}
     */
    this.pop = function () {
        return item.pop()
    };
    /**
     * 返回栈顶的元素,不对栈做任何修改
     * @returns {*}
     */
    this.peek = function () {
        return item[item.length - 1]
    };
    /**
     * 如果栈里没有任何元素就返回true,否则返回false
     * @returns {boolean}
     */
    this.isEmpty = function () {
        return item.length === 0
    };
    /**
     * 移出栈里的所有元素
     */
    this.clear = function () {
        item = []
    };
    /**
     * 返回栈里的元素个数
     * @returns {Array|number}
     */
    this.size = function () {
        return item.length
    }
}

ES6语法声明

class Stack {
    constructor() {
        this.items = [];
    }
    push(element) {
        this.items.push(element)
    }
    // 其他方法
}
/**
 * 由于根据原型实现,无法创建私有属性
 */
/**
 * 改进1
 * 使用ES6新增类型Symbol,基本类型,通常不可改变
 *
 * ES6中Object.getOwnPropertySymbol()方法能够获取到类里面声明的所有Symbol属性,通过这个可以操作其他数组方法
 */
let _items = Symbol();
class Stack {
    constructor() {
        this[_items] = [];
    }
    // Stack方法
    push(element) {
        this[_items].push(element)
    }
}
let demo = new Stack();
let objSymbols = Object.getOwnPropertySymbols(demo);
demo[objSymbols[0]].pop();// 可以访问未暴露的数组方法
/**
 * 改进2
 * 使用WeakMap实现类(ES6新的集合类型,存储键值对,避开对数组方法的直接访问)
 */
let Stack = (function () {// 闭包使得外部无法访问WeekMap,达到私有目的,并且不会暴露其他未暴露的数组方法
    const items = new WeakMap();
    class InnerStack {
        constructor() {
            items.set(this, [])
        }
        push(element) {
            items.get(this).push(element)
        }
        pop() {
            return items.get(this).pop()
        }
        print() {
            return items.get(this).toString()
        }
    }
    return InnerStack
})();
// 改进2 的方法使得子类无法继承私有属性

栈的应用:十进制转二进制

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108868.html

相关文章

  • JS学习笔记4)(变量、作用域和内存问题)

    摘要:具体来说就是当执行流进入下列任何一个语句时,作用域链就会得到加长语句的块和语句。这两个语句都会在作用域链的前端添加一个变量对象。对来说,会将指定的对象添加到作用域链中。 1. 基本类型和引用类型的值 JavaScript变量可以用来保存两种类型的值:基本类性值和引用类性值。基本类型值源自以下5种基本数据类型:Undefined、Null、Boolean、Number和String。基本...

    linkin 评论0 收藏0
  • Java学习路线总结,搬砖工逆袭Java架构师(全网最强)

    摘要:哪吒社区技能树打卡打卡贴函数式接口简介领域优质创作者哪吒公众号作者架构师奋斗者扫描主页左侧二维码,加入群聊,一起学习一起进步欢迎点赞收藏留言前情提要无意间听到领导们的谈话,现在公司的现状是码农太多,但能独立带队的人太少,简而言之,不缺干 ? 哪吒社区Java技能树打卡 【打卡贴 day2...

    Scorpion 评论0 收藏0
  • JavaScript数据结构算法笔记——1 JavaScript简介

    摘要:异或左移右移删除属性不同类型之间比较在比较对象时,比较的是引用和是内部方法对不同的类型返回结果如下表对不同类型返回结果如下类申明函数有两种方法在原型上申明函数,只会创建一次,在所有实例中共享,可以节约内存和降低实例化的开销在类定义中申明函数 ^ 异或 > 右移 delete 删除属性 不同类型之间==比较 showImg(https://segmentfault.c...

    Cheng_Gang 评论0 收藏0
  • JavaScript数据结构算法笔记——2 数组

    数组操作方法 方法 描述 备注 push() 将元素添加到数组末尾 修改原数组 unShift() 将元素插入到数组首位(将每项向后移动一位,在第一位插入元素) 修改原数组 pop() 删除数组最后一个元素 修改原数组 shift() 删除数组第一个元素(将每项向前移动一位并删除最后一项) ...

    Martin91 评论0 收藏0
  • JavaScript数据结构算法笔记——7 字典和散列表

    摘要:在字典中,存储的是键,值,集合可以看作值,值的形式存储元素,字典也称为映射方法描述备注向字典中添加新元素通过某个键值从字典中移除对应的数据值判断某个键值是存在于这个字典中通过键值获取对应的数据值返回字典所有元素的数量删除字典中所有元素将字典 在字典中,存储的是[键,值],集合可以看作[值,值]的形式存储元素,字典也称为映射 方法 描述 备注 set(key,...

    zorro 评论0 收藏0

发表评论

0条评论

cyqian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<