【数据结构与算法】JavaScript实现栈结构(Stack)

news2025/4/7 12:40:59

文章目录

      • 一、前言
        • 1.1.什么是数据结构?
        • 1.2.什么是算法?
      • 二、栈结构(Stack)
        • 2.1.简介
        • 2.2.封装栈类

一、前言

1.1.什么是数据结构?

数据结构就是在计算机中,存储和组织数据的方式。

例如:图书管理,怎样摆放图书才能既能放很多书,也方便取?

主要需要考虑两个问题:

  • 操作一:新书怎么插入?
  • 操作二:怎么找到某本指定的书?

常见的数据结构:

  • 数组(Aarray)
  • (Stack)
  • 链表(Linked List)
  • (Graph)
  • 散列表(Hash)
  • 队列(Queue)
  • (Tree)
  • (Heap)

注意:数据结构与算法与语言无关,常见的编程语言都有直接或间接的使用上述常见的数据结构。

1.2.什么是算法?

算法(Algorithm)的定义

  • 一个有限指令集,每条指令的描述不依赖于语言;
  • 接收一些输入(有些情况下不需要输入);
  • 产生输入;
  • 一定在有限步骤之后终止;

算法通俗理解:解决问题的办法/步骤逻辑。数据结构的实现,离不开算法。

二、栈结构(Stack)

2.1.简介

数组是一个线性结构,并且可以在数组的任意位置插入和删除元素。而栈和队列就是比较常见的受限的线性结构。如下图所示:

https://cdn.jsdelivr.net/gh/itpeilibo/StorePicture@main/img/Stack1.png

栈的特点为先进后出,后进先出(LIFO:last in first out)。

程序中的栈结构:

  • 函数调用栈:A(B(C(D()))):即A函数中调用B,B调用C,C调用D;在A执行的过程中会将A压入栈,随后B执行时B也被压入栈,函数C和D执行时也会被压入栈。所以当前栈的顺序为:A->B->C->D(栈顶);函数D执行完之后,会弹出栈被释放,弹出栈的顺序为D->C->B->A;
  • 递归:为什么没有停止条件的递归会造成栈溢出?比如函数A为递归函数,不断地调用自己(因为函数还没有执行完,不会把函数弹出栈),不停地把相同的函数A压入栈,最后造成栈溢出(Stack Overfloat)

练习:题目:有6个元素6,5,4,3,2,1按顺序进栈,问下列哪一个不是合法的出栈顺序?

  • A:5 4 3 6 1 2 (√)
  • B:4 5 3 2 1 6 (√)
  • C:3 4 6 5 2 1 (×)
  • D:2 3 4 1 5 6 (√)

题目所说的按顺序进栈指的不是一次性全部进栈,而是有进有出,进栈顺序为6 -> 5 -> 4 -> 3 -> 2 -> 1。

解析:

  • A答案:65进栈,5出栈,4进栈出栈,3进栈出栈,6出栈,21进栈,1出栈,2出栈(整体入栈顺序符合654321);
  • B答案:654进栈,4出栈,5出栈,3进栈出栈,2进栈出栈,1进栈出栈,6出栈(整体的入栈顺序符合654321);
  • C答案:6543进栈,3出栈,4出栈,之后应该5出栈而不是6,所以错误;
  • D答案:65432进栈,2出栈,3出栈,4出栈,1进栈出栈,5出栈,6出栈。符合入栈顺序;

栈常见的操作:

  • push(element):添加一个新元素到栈顶位置;
  • pop():移除栈顶的元素,同时返回被移除的元素;
  • peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它);
  • isEmpty():如果栈里没有任何元素就返回true,否则返回false;
  • size():返回栈里的元素个数。这个方法和数组的length属性类似;
  • toString():将栈结构的内容以字符串的形式返回。
2.2.封装栈类

代码实现:

    // 封装栈类
    function Stack(){
      // 栈中的属性
      this.items =[]

      // 栈的相关操作
      // 1.push():将元素压入栈
      //方式一(不推荐):给对象添加方法,其他对象不能复用
      // this.push = () => {
      // }
      
      //方式二(推荐):给Stack类添加方法,能够多对象复用
      Stack.prototype.push = function(element) {
      // 利用数组item的push方法实现Stack类的pop方法
        this.items.push(element)
      }

      // 2.pop():从栈中取出元素
      Stack.prototype.pop = () => {
      // 利用数组item的pop方法实现Stack类的pop方法
        return this.items.pop()
      }

      // 3.peek():查看一下栈顶元素
      Stack.prototype.peek = () => {
        return this.items[this.items.length - 1]
      }

      // 4.isEmpty():判断栈是否为空
      Stack.prototype.isEmpty = () => {
      // 两个小时的教训啊不是this.length(不是Stack对象的length,Stack类没有length属性啊),而是			Stack类中定义的数组items才有length属性呀
        return this.items.length == 0 
      }

      // 5.size():获取栈中元素的个数
      Stack.prototype.size = () => {
        return this.items.length
      }

      // 6.toString():以字符串形式输出栈内数据
      Stack.prototype.toString = () => {
        //希望输出的形式:20 10 12 8 7
        let resultString = ''
        for (let i of this.items){
          resultString += i + ' '
        }
        return resultString
      }
    }

测试代码:

 // 栈的使用
    let  s = new Stack()
    s.push(20)
    s.push(10)
    s.push(100)
    s.push(77)
    console.log(s)													//65

    console.log(s.pop());											//68
    console.log(s.pop());											//69
    
    console.log(s.peek());											//71
	console.log(s.isEmpty());										//72
   
    console.log(s.size());											//74
    console.log(s.toString());										//75

测试结果:

https://cdn.jsdelivr.net/gh/itpeilibo/StorePicture@main/img/Stack2.png

栈结构的简单应用:

利用栈结构的特点封装十进至转换为二进至的函数:

    //简单应用:
    //封装函数:将十进制转成二进制(十转二的运算最后倒叙取余的特点符合栈'先进后出')
    let dec2bin = decNumber => {
      //1.定义一个栈对象,保存余数
      var  stack = new Stack()

      // 2.循环操作
      while(decNumber > 0){
        // 2.1.获取余数并放入栈中
        stack.push(decNumber % 2)
        // 2.2.获取整除后的结果作为下一次运算的数字(floor:向下取整)
        decNumber = Math.floor(decNumber / 2)
      }

      // 3.从栈中取出0和1
      let  binaryString = '';
      let a = stack.items.length
     while(stack.items.length != 0){
        binaryString += stack.pop();
      }
      return binaryString;
    }
    
    //测试代码
    console.log(dec2bin(10));										//103
    console.log(dec2bin(100));										//104
    console.log(dec2bin(1000));										//105

测试结果:

https://cdn.jsdelivr.net/gh/itpeilibo/StorePicture@main/img/Stack3.png

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

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

相关文章

功率放大器如何驱动超声波换能器

驱动超声波换能器的功率放大器在超声波应用中起着至关重要的作用。它能够提供足够的功率和精确的信号控制,使换能器能够有效地将电能转换为超声波能量。下面安泰电子将介绍功率放大器如何驱动超声波换能器的原理和关键要点。 首先,让我们了解一下超声波换…

2021款别克英朗,汽车空调使用方法

2021款别克英朗,汽车空调使用方法 今天就给大家一起交流探讨一下别克英朗2021款1.5L配置的汽车空调该如何正确使用。 别克英朗2021款1.5L配置的空调为手动空调,所有的空调操作都需要我们自己判断,比如如何正确使用制冷制热,内外循…

如何理解交通部EDI报文:舱单报文IFCSUM

舱单报文IFCSUM的发送方向 发送方:船公司、船舶代理 接收方:集装箱码头、理货、港监等 舱单报文IFCSUM的功能 此文件对应IFCSUM报文的舱单子集,提供某一航次运输货物的信息,说明承运人、运输方式、运输工具、设备及联运货物的细…

大模型的实践应用2-基于BERT模型训练医疗智能诊断问答的运用研究,协助医生进行疾病诊断

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用2-基于BERT模型训练医疗智能诊断问答的运用研究,协助医生进行疾病诊断。医疗大模型通过收集和分析大量的医学数据和临床信息,能够协助医生进行疾病诊断、制定治疗方案和评估预后等任务。利用医疗大模型,可以帮助医生…

南美玻利维亚市场最全分析开发攻略,收藏一篇就够了

中国也是玻利维亚最大的贸易伙伴。当地时间2023年7月27日,玻利维亚经济与公共财政部长蒙特内格罗表示,玻利维亚政府决心在对外贸易中减少对美元的依赖,一些玻利维亚外贸企业已经开始使用人民币进行结算。到目前为止,玻利维亚跟中国…

选择腾讯共享wifi贴项目公司时,有哪些注意事项?!

在如今移动互联网时代,无线网络已经成为人们生活中必不可少的部分。虽然公共场所和商家开始提供免费WiFi,但是用户在连接时都要去咨询密码很是麻烦,腾讯共享WiFi贴凭借着高效、快速地便捷连接方式切入顾客的需求和共享市场,很多创…

14.9 Socket 高效文件传输

网络上的文件传输功能也是很有必要实现一下的,网络传输文件的过程通常分为客户端和服务器端两部分。客户端可以选择上传或下载文件,将文件分块并逐块发送到服务器,或者从服务器分块地接收文件。服务器端接收来自客户端的请求,根据…

【软考】6.1 信息安全及技术

《信息安全和信息系统安全》 信息安全系统的体系架构 网络安全空间五大要素:认证、权限、完整、加密、不可否认(抵赖) 信息安全含义及属性 信息安全三要素:保密性、完整性、可用性最小授权原则:该有什么权限&#xf…

软件测试基础知识 + 面试理论(超详细)

一、什么是软件? 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试? 说法一:使用人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异…

Mac系统快速切换和管理node版本

如何下载node 不要下载最新版,推荐先下载稳定版的nodejs.org/zh-cn/downl…,下载完一键式安装即可,安装完成后,命令行查看是否成功。 1、使用n切换node版本 node有一个模块n,是专门用来管理node.js的版本的。npm是用…

数据导入与预处理-第4章-Python标准库之json

文章目录 资源json概述json案例dumps案例dump案例中文编码问题格式化问题 loads案例load案例 资源 参考:https://zhuanlan.zhihu.com/p/436465279 https://blog.csdn.net/impoijimlq/article/details/130445399 json概述 什么是json json是一种轻量级的文本数据 交换格式jso…

【代码软实力】职场高效沟通技巧

一、沟通三要素 二、什么是沟通 三、沟通的难点 四、向上沟通-结构化表达 上级结构化表达的案例 五、平级沟通-非暴力沟通 平级非暴力沟通案例 六、下级沟通-行为影响结果原则BIC 下级沟通案例分析 思维导图

如何在MT4和MT5复制交易?有缺点吗?anzo capital昂首资本1秒答

很多投资者不知道如何在MT4和MT5上复制交易信号?其实很简单,今天anzo capital昂首资本1分钟解答,复制交易的方法包括: 在MetaQuotes社区进行交易复制和信号的传播。MT4和MT5均具备连接到这个社区的功能。以下是使用该功能的步骤&…

Crypto(2)攻防世界-幂数加密

先看题,给出了flag格式和幂数加密的方式。 附件里的内容为8842101220480224404014224202480122 正常的二进制幂数加密只有0,1,2,3,4,5,是不会出现8的。通过百度了解到这是云影密码、 简单说来…

Anaconda安装

前言: 在学习机器学习时,一般都会使用Anaconda。 Anaconda是一个强大的开源数据科学平台,它将很多好的工具整合在一起,极大地简化了使用者的工作流程,并能够帮助使用者解决一系列数据科学难题。 有小伙伴纠结先安装python还是安…

【好玩的开源项目】Linux系统之部署跳一跳经典小游戏

【好玩的开源项目】Linux系统之部署跳一跳经典小游戏 一、跳一跳小游戏介绍1.1 跳一跳小游戏简介1.2 项目地址 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、安装httpd软件3.1 检查yum仓库3.2 安装httpd软件3.3 启动httpd服务3.4 查看httpd服务3.5 防火墙和selinux设…

通过这个技术,浏览器可以运行Node.js、Rust、Python、PHP、C++、Java代码了!

近日,WebContainers 发布重要更新,WASI(WebAssembly 系统接口)已全面集成到 WebContainers 中。这是一个重要里程碑,它扩大了可以使用浏览器执行的操作,是 Web 开发的全新范例,允许运行大量原生…

Java封装:面向对象的三大特性之一

👑专栏内容:Java⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、封装的概念二、访问修饰限定符三、包1、包的概念2、导入包中的类3、常见的包 嗨!前面我们简单的认识了一下什么…

vite+vue3.0 + TypeScript+element-plus环境搭建

1、环境要求:node版本16以上 2、搭建vite项目 npm create vitelatest cmd运行下面命令 cd vite-project npm install npm run dev 谷歌浏览器访问http://127.0.0.1:5173/ 查看效果 3、安装element-plus组件 npm运行以下命令进行安装element-plus npm install elem…

汽车屏类产品(二):360全景环视(SVC)、多分割显示、行车记录

前言 随着新能源汽车的快速发展,带动了车载器件的大发展,大的比如域控,小的创新更是不断涌现。而车载显示屏可以说是一大类产品,产品形态也是愈发多样化,比如:仪表cluster、中控IVI、副驾屏、行车记录仪、流媒体后视镜、透明A柱屏、方向盘屏(替代方向盘按键)、门饰板显…