数据结构--栈—JS实现一个栈结构

2023-11-03

数据结构–栈—JS实现一个栈结构

前言:数据结构和算法是脱离语言的,比如pop,push在js中可以使用,但是其他的语言也有吗? 不一定,但是都可以通过数据结构和算法写出其功能

(1)栈是一种后进先出(LIFO)last in first out原则的有序集合;只能从后边添加元素和从开头删除元素

(2)新添加或待删除的元素都保存在栈的同一端,为栈顶(push( 数组中末位置添加元素)数组中的pop(删除数组中最后边的元素也就是先添加进去的))

(3)在栈里新元素都靠近栈顶,旧元素都接近栈底

实现一个栈结构/符合LIFO的原则,需要对插入的数据和删除的数据功能进行限制
实现以下的方法
push(eles):添加一个或者多个元素到栈顶
pop: 移除栈顶的元素,同时返回被移除的元素
peek:返回栈顶的元素,不对栈本身做任何修改
isEmpty:判断栈顶的元素,不对栈本身做任何修改
size:返回栈里面的元素个数,和数组的length属性类似
clear:移除栈元素里边的所有元素
toString:将栈里边的内容通过逗号字符串进行拼接成一个字符串
forEach:讲栈里边的内容进行遍历参数是一个回调函数callback
for of 接口:实现栈皆否的迭代器接口(数组有for of的接口,但是items是一个对象本身没有for of)

直接上代码

/*
数据结构和算法是脱离语言的,比如pop,push在js中可以使用,但是其他的语言也有吗?
不一定,但是都可以通过数据结构和算法写出其功能
    实现一个栈结构/符合LIFO的原则,需要对插入的数据和删除的数据功能进行限制
    实现以下的方法
    push(eles):添加一个或者多个元素到栈顶
    pop: 移除栈顶的元素,同时返回被移除的元素
    peek:返回栈顶的元素,不对栈本身做任何修改
    isEmpty:判断栈顶的元素,不对栈本身做任何修改
    size:返回栈里面的元素个数,和数组的length属性类似
    clear:移除栈元素里边的所有元素
    toString:将栈里边的内容通过逗号字符串进行拼接成一个字符串
    forEach:讲栈里边的内容进行遍历参数是一个回调函数callback
    for of 接口:实现栈皆否的迭代器接口(数组有for of的接口,但是items是一个对象本身没有for of)
    
 */
class Stack {
    constructor() {
        this.count = 0; // 栈的计数器
        this.items = {}; // 栈的数据仓库
    }
    push(...eles) { // 解构一下,可能是一个或者多个
        for (let i = 0, len = eles.length; i < len; i++) {
            //采用计数器的当前值(自然数)为key,存储实际的数据
            this.items[this.count] = eles[i]
            this.count++; //每当push一个数据,计数器自增一个1

        }
    }
    size() {
        return this.count;
    }
    isEmpty() {
        return !this.count; //取反转成布尔值
    }
    pop() {
        if (this.isEmpty()) {
            // 判断栈是否为空,返回undefined
            return undefined;
        }
        this.count--; //计数器自减一个1,得到的就是未删除前最后一个栈顶值的key
        let result = this.items[this.count] // 返回一个栈顶的值
        delete this.items[this.count] //删除栈顶的值
        return result
    }
    peek() {
        if (this.isEmpty()) {
            // 判断栈是否为空,返回undefined
            return undefined;
        }
        return this.items[--this.count] //返回一个栈顶的值这里不能用this.count--,可以用this.count-1
    }
    clear() {
        while (!this.isEmpty()) {
            this.pop()
        }
    }
    toString() {
        if (this.isEmpty()) {
            return ""
        }
        let resultString = ""
        for (let i = 0; i < this.count; i++) {
            result = `${resultString},${this.items[i]}` //  会多一个逗号
        }
        return resultString.slice(1) //跳过第一逗号返回
        // 如果上边用+=,那么逗号,就在后边,也要删掉最后一个逗号,都可以
    }
    forEach(cb) {
        for (let i = 0; i < this.count; i++) {
            // 索引,每一项,arr本身(此时如果是this.item的话就不能调用里边的方法了,所以是this,item知识存放数据的对象)
            cb(i, this.items[i], this)
        }
    }
    // 迭代器,也可以增加拦截,在return中进行判断或者增加内容,遍历的时候就起到了作用(底层内容,会改变整个js的判断条件)
    [Symbol.iterator]() {
        let self = this;
        let index = 0;
        return {
            next() {
                if (index < self.count) {
                    return {
                        value: self.items[index++],
                        done: false // 表示是否可以继续往下遍历,如果为false继续
                    }
                } else {
                    return {
                        value: undefined,
                        done: true // 表示迭代结束
                    }
                }

            }
        }
    }
}

// 我们可以用这个来做一个基本实现
let arr = new Stack();
console.log(arr) //打印看一下结构
// 其他方法就可以使用了
arr.push("hello")
arr.push("world")
arr.forEach(function (index, item, arr) {
    console.log({
        index,
        item
    })
})

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构--栈—JS实现一个栈结构 的相关文章

  • 为什么隐式符号到字符串转换会导致 JavaScript 中出现类型错误?

    有一个 toString on Symbol在 ES6 中 它返回字符串表示形式Symbol 但想知道为什么 Symbol 不起作用 运行这个表达式会抛出TypeError我没想到 后者只是打电话吗 toString 在一个新的Symbol
  • 如何在bootstrap中默认隐藏侧边栏?

    我在这里有一个很好的参考 作为 Bootstrap 在设计 Web 表单应用程序时的侧边栏 http startbootstrap com template overviews simple sidebar http startbootst
  • 如何使用 JavaScript 选择预节点/块中的文本?

    我了解不允许 JS 将任意文本复制到剪贴板背后的安全原因 但是是否有一种方法可以通过单击按钮来选择预节点中的文本 类似于 select 函数在输入中的工作方式 我不是在寻找复制到剪贴板的 jQuery 插件 我只想突出显示预块中的文本 以便
  • 雅虎 OAuth2 隐式授予流程不适用于新的雅虎应用程序

    我有现有的网络应用程序和专用雅虎应用程序 https developer yahoo com apps 在职的 它用OAuth2 隐式授权流程 https developer yahoo com oauth2 guide flows imp
  • 实现悬停信息框

    我有一个日历 当用户将鼠标悬停在单元格上时 会出现一个很大的信息框 其中包含该日期的详细信息 虽然当用户离开时使信息框消失 但我遇到了一些麻烦 我基本上想要它 这样当鼠标光标移出信息框隐藏的日历单元格时 它就会消失 但我遇到了麻烦 因为mo
  • Javascript 在另一个函数中检测“Shift”键按下

    我正在从 Flash 影片 使用外部接口 调用我的 html 页面中的 Javascript 函数 并且我想知道调用该函数时用户是否按下了 Shift 键 例如 如果我通过鼠标单击调用该函数 这似乎很简单 因为我可以传递事件并检查 if e
  • 在多个动态添加的表单上初始化 jQuery validate() 函数

    有人建议最好初始化一个 form validate 在页面加载而不是点击事件上运行 jquery form validate 插件仅允许在输入更改时提交 https stackoverflow com questions 10984196
  • Angularjs 完整日历不显示事件

    我正在用那个https github com angular ui ui calendar https github com angular ui ui calendar在 Angularjs 中使用 FullCalendar 它显示日历并
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • html canvas动画卡顿

    谁能解释为什么提供的画布动画断断续续 我创建了一个测试存根来演示该问题 我在桌面上的 FF Chrome IE 以及 Android 上的 FF 和 Chrome 中看到了卡顿现象 口吃是由于垃圾收集造成的吗 似乎 raf 在每次调用时都会
  • 为什么我们使用 SpreadsheetApp.flush()?

    我的理解是 flush https developers google com apps script reference spreadsheet spreadsheet app flush有助于在功能发生时执行这些功能 而无需将它们捆绑在
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • Javascript onload 不起作用[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • 具有固定顶部菜单的语义 UI 侧边栏

    Semantic UI 对其进行预警侧边栏页面 http semantic ui com modules sidebar html usage 当侧边栏出现时 固定位置内容可能会出现改变其位置的问题 然后它提供了该问题的两种可能的解决方案
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我
  • 搜索多维数组 JavaScript

    我有一个如下所示的数组 selected products 0 r1 7up 61 Albertsons selected products 1 r3 Arrowhead 78 Arrowhead selected products 2 r
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax

随机推荐

  • PaddleX入门教程2:搭建并配置Paddlex的推理环境(CPU版本)

    上一个教程中 同学们掌握了利用PaddleX完成训练并发布模型后 接下来我们将通过Python脚本来调用该模型 并做一些基础应用 本节教程主要教同学们从零搭建调用PaddleX导出模型的运行环境 1 运行PaddleX推理需要安装Visua
  • springboot学习(十)web工程扩展

    登录接口 这里是基于演示代码写的登录接口 实际肯定不会这么low 会出现get请求 包括参数注解也会用的是 RequestBody而不是 RequestParam Controller public class LoginControlle
  • Mac下,在VirtualBox上创建一台虚拟机

    1 Mac下 在VirtualBox上创建一台虚拟机 主机 Mac 32位 内存8G 虚拟机 Oracle VM VirtualBox 版本 软件 Linux安装软件 版本6 2 ISO映像 rhel server 6 2 i386 dvd
  • 【浅谈PC市场】

    市场调研机构Canalys数据显示 今年一季度 中国市场整体PC出货量同比下降24 至890万台 已是连续第五个季度下跌 今年截至618结束 都没有一家主要的PC厂商愿意发战报 PC市场怎样走出寒冬 谈谈你的理解和看法 PC市场在近年来确实
  • 基于VB脚本开发的机器人高级语言进行轨迹规划演示

    采用VB基本语言 在其中嵌入机器人运动控制指令 扩展成机器人高级编程语言 本例子演示的是高级螺旋线轨迹规划 movep 0 0 0 0 0 0 a 0 2 b 0 2 12 56 for i 0 to 12 56 step 0 01 x a
  • MNIST手写数字库格式转换(c++可用的格式)

    static int ReverseInt int i 转换魔数 读取数据库中的图片数 行数 列数等信息 unsigned char ch1 ch2 ch3 ch4 ch1 i 255 ch2 i gt gt 8 255 ch3 i gt
  • 在Windows7环境下使用GIT BASH免输入密码

    背景 根据一路向北的教 Windows下TortoiseGit over Putty or Openssh提交项目到GitLab 安装了TortoiseGit客户端 并完成在Gitlab上公钥的部署 但是有些操作必须通过GITbash命令行
  • 现代教育技术计算机网络试题及答案,《现代教育技术》期末复习题及答案

    现代教育技术期末复习1 一 填空题 1 教育技术就是人类在教育活动中所采用的一切 和方法的总和 它分为有形的技术 物化形态 和 的技术 智能形态 两大类 答案 技术手段 无形 2 学习资源主要包括教学材料 和 答案 支持系统 学习环境 3
  • UE4c++ Brush创建

    前言 UE4常用的new FSlateBrush的方式与正常的SlateStyle的方式就不说了 这类的文章很多 这里主要仿照引擎源码加载图片的方式加加载 参考源码 FTestStyle h class FMainStyle public
  • SpringBoot主程序运行及配置文件

    主程序运行 SpringBootApplication public class SpringbootApplication public static void main String args SpringApplication run
  • 5G 的未来

    目录 5G流量 5G应用场景 VR AR MR 5G关键技术 超密集组网 5G关键技术 动态自组织网 SON 软件定义网络SDN SDN与NFV的深度融合 5G挑战 频谱资源 新业务的挑战 新使用场景的挑战 终端设备带来的挑战 5G面临的安
  • 反射和多线程基础

    Version 邢朋辉 今日主播 邢朋辉 QQ 345086739 一 今日内容 1 1 课程回顾 1 2 反射是啥 1 3 进程和线程 1 4 线程的创建方式 1 5 线程的状态 1 6 线程的常用方法 二 课程回顾 Java的基本语法
  • R语言的常用的包

    在学习R的时候 R的包众多 很多时候对于初学者会造成很大的困扰就是不知道用什么样的包比较合适 我会在不断使用R的过程中 进行使用同时结合使用体验为大家推荐合适的R包 避免重复学习 以节约时间 标了 精 的是需要重点研究和掌握的包 1 数据导
  • 写CSDN博客时,调节字体、大小、颜色

    字体颜色样式系列 为了突出重点内容 想设置不同颜色 颜色挑选网址 https blog csdn net wo919191 article details 84249531 face设置字体 文本内容使用font标签包裹 可通过face设置
  • 查询tomcat可用 端口

    步骤一 cmd输入 输入 netstat ano 步骤二 查询端口号是否被占用 netstat aon findstr 端口号 步骤三 查询占用端口的应用 tasklist findstr 查询出的 listening 步骤四 taskki
  • 如果有多个异步函数需要保证同时执行并保证全部执行完毕后再进行下一步

    array push api post array push api get Promise all array then resArr gt resArr forEach res gt console log res 在 then后面判断
  • python3 抖音短视频链接去水印下载视频到本地

    基于近段时间对抖音 快手 秒拍等视频抓取一直想搞一下 加了个QQ群 里面全是自媒体 就是抖音 快手 秒拍的视频搬运工 把一个平台搬到另外一个平台上 去除水印 降低被干掉的危险 经过半天的琢磨 自己用python也搞出来一个根据抖音分享视频链
  • python用input输入列表_python怎么用input函数输入一个列表

    在Python3 0以后 键盘输入使用input函数 gt gt gt x input gt gt gt 123 123 在命令行没有任何显示 输入123后直接赋值给x 并打印 仅仅使用input是无法解决大部分数据处理的 通常输入的字符串
  • Python构建ANN模型预测气温变化

    在利用爬虫模型得到了气温数据集后 具体参考上篇Python构建爬虫模型爬取天气数据 我们开始利用tensorflow自带的模块搭建一个简单的ANN模型预测气温变化 其实这个模型适用于预测很多数据变化趋势 这里以预测气温变化为例 import
  • 数据结构--栈—JS实现一个栈结构

    数据结构 栈 JS实现一个栈结构 前言 数据结构和算法是脱离语言的 比如pop push在js中可以使用 但是其他的语言也有吗 不一定 但是都可以通过数据结构和算法写出其功能 1 栈是一种后进先出 LIFO last in first ou