js数据结构之栈

news2024/11/15 21:40:27

1.栈数据结构

栈是一种遵从后进先出LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
在现实生活中也能发现许多栈的例子。例如,下图中的一摞书。
在这里插入图片描述

栈也被用在编程语言的编译器和内存中保存变量、方法调用等,浏览器历史记录。

1.1 创建一个基于数组的栈

我们需要一种数据结构来保存栈里的元素。可以选择数组。数组可以在任何位置添加或删除元素。由于栈遵循LIFO原则,需要对元素的插入和删除功能进行限制。也要为栈声明一些方法。

创建一个类来表示栈。

class Stack {
    constructor() {
        this.items = []
    }

    // 添加新元素到栈顶
    push(element) {
        return this.items.push(element)
    }

    // 移除栈顶的元素,同时返回被移除的元素
    pop() {
        return this.items.pop()
    }

    // 返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
    peek () {
        return this.items[this.items.length - 1]
    }

    // 如果栈里没有任何元素就返回true,否则返回false
    isEmpty () {
        return this.items.length === 0
    }

    // 清空栈里的所有元素
    clear() {
        return this.items = []
    }

    // 返回栈里的元素个数。该方法和数组的length属性很类似
    size() {
        return this.items.length
    }
}

1.2 使用Stack 类

首先需要初始化类,然后验证下栈是否为空。

const stack = new Stack()
console.log(stack.isEmpty())  // true

接下来,往栈里添加一些元素

stack.push(5)
stack.push(8)
console.log(stack.peek()) // 输出 8

再添加一个元素

stack.push(11)
console.log(stack.size()) // 输出 3
console.log(stack.isEmpty) // 输出false

我们往栈里添加了11,如果调用了size方法,输出3,因为栈里有三个元素(5, 8,11),如果我们调用isEmpty方法,会看到false。最后,我们再添加一个元素。

stack.push(15)

下图描述了栈的当前状态
在这里插入图片描述
结果,连续两次调用pop方法,从栈里移除两个元素

stack.pop()
stack.pop()
console.log(stack.size()) // 输出 2

在两次调用pop方法前,我们的栈里有四个元素。调用两次后,现在栈里仅剩下5和8了。如下图所示:
在这里插入图片描述

1.3 使用JavaScript对象创建Stack类

使用数组时,大部分的时间复杂度是O(n)。O(n)的意思是,我们需要迭代整个数组直到找到的那个元素。另外数组时元素的一个有序集合,为了保证元素的排列有序,会占用更多空间。
创建Stack类如下:

class Stack {
    constructor() {
        this.count = 0
        this.items = {}
    }

    // 添加新元素到栈顶
    push (element) {
        this.items[this.count] = element
        this.count++
    }

    // 移除栈顶的元素,同时返回被移除的元素
    pop () {
        if (this.isEmpty()) {
            return undefined
        }
        this.count --
        const result = this.items[this.count]
        delete this.items[this.count]
        return result
    }

    // 返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
    peek () {
        if (this.isEmpty()) {
            return undefined
        }
        return this.items[this.count - 1]
    }

    // 如果栈里没有任何元素就返回true,否则返回false
    isEmpty () {
        return this.count === 0
    }

    // 清空栈里的所有元素
    clear () {
        this.items = {}
        this.count = 0
    }

    // 返回栈里的元素个数。该方法和数组的length属性很类似
    size () {
        return this.count
    }

    // 方法类似于数组的toString()
    toString() {
        if (this.isEmpty()) {
            return ''
        }
        let str = ''
        for (let i = 0; i < this.count; i++) {
            str += this.items[i]
        }
        return str
    }
}

2. 保护数据结构内部元素

对于Stack类来说,要确保元素只会被添加到栈顶。而不是栈底或其他位置。

2.1 下划线命名

下划线命名约定就是在属性名称之前加上一个(_)。不过这种方式只是一种约定,并不能保护数据,而且只能依赖于使用我们开发者具备的常识。

class Stack { 
 constructor() { 
 this._count = 0; 
 this._items = {}; 
 } 
}

2.2 用symbol实现类

2.3 用weakMap实现类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【服务器数据恢复】Raid5崩溃导致EMC存储不可用的数据恢复案例

服务器数据恢复环境&#xff1a; EMC存储&#xff0c;多块stat硬盘组建raid5磁盘阵列&#xff0c;两块热备盘&#xff0c;上层采用zfs文件系统。 服务器故障&检测&分析&#xff1a; EMC存储中的raid5磁盘阵列有2块硬盘出现故障&#xff0c;但是只有一块热备盘被激活&am…

关于原型和原型链的整理学习

关于原型和原型链是很多人学习或面试时遇到的问题&#xff0c;可能部分不懂&#xff0c;部分懂但不会说&#xff0c;下面关于原型和原型链进行简单的整理总结&#xff0c;希望可以帮助到大家。 一、JS中的原型和原型链 1、原型说明 所有的引用类型&#xff08;数组、函数、对…

【Tools】Git和VS Code配置

文章目录0 前期教程1 前言2 基本使用2.1 配置2.2 获取帮助3 GitHub仓库和git3.1 新建一个GitHub仓库3.2 删除一个仓库&#xff08;repository&#xff09;3.3 上传项目代码4 git常用指令4.1 创建分支4.2 合并分支4.3 在git提交记录上移动4.4 撤销变更4.5 整理提交记录5 在VS Co…

蓝桥杯 stm32 DAC

文章代码使用 HAL 库。 文章目录前言一、根据手册了解 DAC 重要特性 :二、CubeMX 创建工程&#xff1a;三、DAC 代码&#xff1a;1. 设置DAC输出值函数。2. 开启DAC输出函数。3. DAC 输出电压。总结前言 DAC 就是 数字模拟信号转换器 &#xff0c;也就是把 数字信号转变成模拟…

实施MES系统前,先想清楚首先用来解决什么问题

MES系统首先用来解决什么问题&#xff1f; 很多人会自然而然地认为&#xff0c;MES系统是用来解决管理问题的&#xff0c;是为了明确管理流程的&#xff0c;是为了建立管控标准的…… 甲方会有很多很多想解决的问题&#xff0c;甚至在系统导入过程中&#xff0c;各个部门也会…

vue中安装与引用echarts示例

第002个点击查看专栏目录Echarts发展到现在&#xff0c;已经陆续经过了很多版本&#xff0c;越来越完善&#xff0c;现在主要研究5.0以上的功能。这里是介绍在vue项目中&#xff0c;如果全局或者局部引用echarts&#xff0c;对项目初装echarts会起到非常大的帮助。 NPM 安装 E…

电脑文件如何自动备份?

电脑文件如何自动备份&#xff1f;计算机的出现是人类科技发展的重要标志&#xff0c;电脑已经成为我们工作、生活以及学习中必不可少的工具&#xff0c;尤其是在工作中的应用&#xff0c;它改变了以前传统的工作方式。电脑的使用给我们带来极大方便的同时&#xff0c;也带来了…

mPEG-SS-NH2 ;mPEG-SS-Amine;甲氧基聚乙二醇-双硫键-氨基-科研用试剂简介

mPEG-SS-NH2 甲氧基聚乙二醇-双硫键-氨基 英文名称&#xff1a;mPEG-SS-NH2 英文别名&#xff1a;mPEG-SS-Amine 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治 外观: 固体或粘性液体&#xff0c;取…

3D渲染优化入【Three.js】

Three.js 应用程序以每秒 60 帧 (FPS) 的速度执行 3D 渲染是流畅和愉快体验的保证。 然而&#xff0c;这是一个有时难以实现的目标&#xff01;本文整理了优化 Three.js 应用程序和达到 60 FPS 的最佳提示和技巧&#xff01; 推荐&#xff1a;使用 NSDT场景编辑器 快速搭建 3D…

Day13【元宇宙的实践构想02】—— 元宇宙与沉浸式交互技术介绍、支撑开发与应用

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 ✍今日内容&#xff1a;《元宇宙的实践构想》02——元宇宙与沉浸式交互技术 &#x1f6a9; 今日留言&#xff1a;亮亮被迫去练科目二啦&#xff0c;定时发布的文章&#xff…

鉴源论坛 · 观通丨联锁系统原理浅析

作者 |刘艳青 上海控安安全测评中心安全测评部测试经理 版块 | 鉴源论坛 观通 01 联锁系统的硬件结构 根据联锁系统的层级关系&#xff0c;联锁系统的硬件层级可以分为4层&#xff1a;人机会话层、联锁层、接口层、室外设备层。 图1 联锁系统的硬件结构 02 联锁系统的软件结…

误删照片音视频文件不要担心 几种方法解救慌乱的你

误删照片音视频文件不要担心 几种方法解救慌乱的你 推荐的几款软件涵盖了大量的恢复方式,手机如果刷机或者损坏找回的几率会越低 免费软件获取方式关注公众号回复8585 更多软件获取方式点我 方法1&#xff1a;从手机相册中恢复手机删除的照片 这里以vivo手机为例,其他手机也是差…

C/C++ Linux Socket网络编程

之前已经学习了QT的socket编程 和 C/C在window环境的socket编程&#xff0c;现在再来学习一波C/C在Linux环境下的socket编程&#xff0c;为以后学习C Linux 服务器开发做准备。 目录 一、Socket简介 二、Socket编程基础 1. 网络字节序 2. sockaddr数据结构 3. IP地址转换函数…

新C++(5):异常

"山&#xff0c;请你慢些走向我呀~"一、异常初始每当我们使用传统C写一些诸如malloc\realloc,或者不允许传入的参数为空(nullptr)时&#xff0c;我们时长会加一个断言(assert),一旦条件为false立即终止程序&#xff0c;不仅如此&#xff0c;当申请的空间够大&#xf…

二叉树:二叉树的最近公共祖先

二叉树的最近公共祖先 文章目录一、题目描述二、解题思路三、代码解析一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c…

Vue实现下载文件而非浏览器直接打开

问题背景 对于一个txt文本、图片、视频、音频等浏览器可以直接使用浏览器进行预览的文件&#xff0c; 使用传统的a标签加download属性进行下载是行不通的&#xff0c;会在浏览器直接打开&#xff0c;因此需要搞一个新的方式进行下载。 实现流程 实现思路 这里使用Vue自定义…

ElasticSearch从入门到出门【中】

文章目录DSL查询文档DSL查询分类全文检索查询使用场景基本语法示例精准查询term查询range查询地理坐标查询矩形范围查询附近查询复合查询相关性算分算分函数查询布尔查询搜索结果处理排序普通字段排序地理坐标排序分页基本的分页深度分页问题高亮高亮原理实现高亮RestClient查询…

档案数据智能采集工厂模型设计与实现

档案信息化从业人员肯定对异构系统数据采集过程中碰到的各种问题深有体会&#xff0c;有源系统供应商不配合的&#xff1b;数据接口不开放的&#xff1b;归档数据不符合规范的&#xff1b;数据敏感不提供的&#xff1b;等等&#xff1b;不一而足。但不幸的是档案信息系统处于政…

C 语言零基础入门教程(二十二)

C 错误处理 C 语言不提供对错误处理的直接支持&#xff0c;但是作为一种系统编程语言&#xff0c;它以返回值的形式允许您访问底层数据。在发生错误时&#xff0c;大多数的 C 或 UNIX 函数调用返回 1 或 NULL&#xff0c;同时会设置一个错误代码 errno&#xff0c;该错误代码是…

VS2017编译c dll的方法-编译bsio

VS2017编译c dll 有三种方法 &#xff08;1&#xff09;.h和.c文件函数增加 __declspec(dllexport) &#xff08;2&#xff09;仅在.h函数添加__declspec(dllexport) &#xff08;3&#xff09;使用.def文件&#xff0c;不用在.h和.c文件的函数前增加__declspec(dllexport) …