在JavaScript中的栈数据结构(Stack )

news2024/12/28 19:41:24

在这里插入图片描述

文章目录

  • 导文
  • 什么是Stack 类?
    • 如何创建一个Stack
    • 如何修改Stack中的值
      • 栈声明方法举例
      • 添加
      • 移除
      • 查看
        • 查看栈顶元素
        • 检查栈是否为空
        • 检查栈的长度
      • 清空栈元素
      • 打印栈元素
    • 完整的Stack函数:
    • 创建Stack的其他方法-用 ES6 语法声明 Stack 类
  • 使用Stack类
  • 在 JavaScript 中使用栈数据结构的好处


导文

JavaScript 中可以通过数组实现栈数据结构。栈是一种遵循后进先出(LIFO)原则的数据结构,它只允许在栈顶进行插入和删除操作。

什么是Stack 类?

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的
同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
注:LIFO:last in first out
图例:
在这里插入图片描述
在这里插入图片描述

如何创建一个Stack

先将创建一个类来表示栈。先声明这个类:

function Stack() { 
 //各种属性和方法的声明
} 

选择一种数据结构来保存栈里的元素。可以选择数组:

function Stack() { 
  //保存栈里的元素
  let items = []; 
 //各种属性和方法的声明
} 


如何修改Stack中的值

栈声明方法举例

  • push(element(s)):添加一个(或几个)新元素到栈顶。
  • pop():移除栈顶的元素,同时返回被移除的元素。
  • peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返
    回它)。
  • isEmpty():如果栈里没有任何元素就返回true,否则返回false。
  • clear():移除栈里的所有元素。
  • size():返回栈里的元素个数。这个方法和数组的length属性很类似。

添加

实现添加的可以使用push。这个方法负责往栈里添加新元素,有一点很重要:该方法只添加元素到栈顶,也就是栈的末尾。
push方法可以这样写:

this.push = function(element){ 
 items.push(element); 
}; 

整体函数:

function Stack() { 
  //保存栈里的元素
  let items = []; 
   //添加新元素
  this.push = function(element){ 
   items.push(element); 
 }; 
 //各种属性和方法的声明
} 

移除

接着来实现移除,主要用来移除栈里的元素,使用的是pop方法。
栈遵从LIFO原则,因此移出的是最后添加进去的元素。
栈的pop方法可以这样写:

this.pop = function(){ 
 return items.pop(); 
}; 

整体函数:

function Stack() { 
  //保存栈里的元素
  let items = []; 
   //添加新元素
  this.push = function(element){ 
   items.push(element); 
  }; 
  //移除元素
 this.pop = function(){ 
  return items.pop(); 
 }; 
 //各种属性和方法的声明
} 

查看

查看栈顶元素

因为栈顶就是最后进入的元素,类内部是用数组保存元素的,所以访问数组的最后一个元素可以用 length - 1。
图例:
在这里插入图片描述

所以,如果想知道栈里最后添加的元素是什么,可以用peek方法。这个方法将返回栈顶的元素:

this.peek = function(){ 
 return items[items.length-1]; 
}; 

检查栈是否为空

可以直接使用length == 0判断,如果栈为空的话将返回true,否则就返回false:

this.isEmpty = function(){ 
 return items.length == 0; 
}; 

检查栈的长度

类似于数组的length属性,我们也能实现栈的length。对于集合,最好用size代替length。
因为栈的内部使用数组保存元素,所以能简单地返回栈的长度:

this.size = function(){ 
 return items.length; 
};

整体函数:

function Stack() { 
  //保存栈里的元素
  let items = []; 
   //添加新元素
  this.push = function(element){ 
   items.push(element); 
  }; 
  //移除元素
 this.pop = function(){ 
  return items.pop(); 
 }; 
 //查看栈顶元素
 this.peek = function(){ 
   return items[items.length-1]; 
 }; 
 //检查栈是否为空
 this.isEmpty = function(){ 
   return items.length == 0; 
 }; 
 //检查栈的长度
 this.size = function(){ 
   return items.length; 
 };
 //各种属性和方法的声明
} 

清空栈元素

clear方法用来移除栈里所有的元素,把栈清空。实现这个方法最简单的方式是:

this.clear = function(){ 
 items = []; 
}; 

另外也可以多次调用pop方法,把数组中的元素全部移除,这样也能实现clear方法。

打印栈元素

为了检查栈里的内容,实现一个辅助方法print。把栈里的元素都输出到控制台:

this.print = function(){ 
 console.log(items.toString()); 
}; 

完整的Stack函数:

function Stack() { 
  //保存栈里的元素
  let items = []; 
   //添加新元素
  this.push = function(element){ 
   items.push(element); 
  }; 
  //移除元素
 this.pop = function(){ 
  return items.pop(); 
 }; 
 //查看栈顶元素
 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()); 
 }; 
} 

这样,我们就完整创建了栈!


创建Stack的其他方法-用 ES6 语法声明 Stack 类

class Stack { 
 constructor () { 
 this.items = []; //{1} 
 } 
 push(element){ 
 this.items.push(element); 
 } 
 //其他方法
}

使用Stack类

先初始化Stack类。再验证一下栈是否为空(输出是true,因为还没有往
栈里添加元素)。

let stack = new Stack(); 
console.log(stack.isEmpty()); //输出为true 

往栈里添加一些元素(这里我们添加数字1和2):

stack.push(1); 
stack.push(2); 

如果调用peek方法,将会输出2,因为它是往栈里添加的最后一个元素:

console.log(stack.peek()); //输出2

再添加一个元素:

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

往栈里添加了11。如果调用size方法,输出为3,因为栈里有三个元素(1、2和11)。
再调用isEmpty方法,会看到输出了false。因为栈里有三个元素,不是空栈。

console.log(stack.isEmpty()); //输出为false

然后,调用两次pop方法从栈里移除1个元素:

stack.pop(); 
console.log(stack.size()); //输出2 
stack.print(); //输出[1, 2] 

在 JavaScript 中使用栈数据结构的好处

实现递归调用:函数调用过程中,每次函数调用都会将新的函数帧(frame)压入栈中,待函数返回时再从栈中弹出。这就是递归调用所依赖的栈结构。
实现浏览器的前进后退功能:浏览器的前进后退功能依赖于两个栈,分别用来维护已经访问过的网页和下一个要访问的网页;用户点击“后退”时,将当前网页从已访问网页的栈中弹出,并将其压入下一个要访问的网页栈中。
对表达式求值:使用栈可以方便地对表达式进行求值,例如判断表达式中括号是否匹配、转换中缀表达式为后缀表达式等。
实现回溯算法:在搜索算法中,一般使用栈数据结构来保存路径信息,当搜索到某一层无解时,直接从栈中弹出该状态并回溯到上一层。

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

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

相关文章

关于GDPR体系文件介绍,介绍GDPR体系文件的内容和意义

随着数字化时代的到来,个人数据保护成为了一个日益受到关注的问题。欧盟于2018年5月25日颁布了“通用数据保护条例”(GDPR),旨在加强对欧洲公民个人数据的保护。GDPR对企业和组织的数据保护和处理流程提出了严格的要求&#xff0c…

自助化打印面单教程

我们都知道,这几年快递行业,从传统纸质面单过渡到了电子面单。以往企业寄快递,能够自行填写纸质面单,等待收件员上门收件,现如今,企业寄件能否自行打印电子面单? 首先我们要先对比一下传统面单和…

云智研发笔试编程题(一):图像相似度

题目描述 给出两幅相同大小的黑白图像 (用0-1矩阵) 表示求它们的相似度。若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。 输入描述 第一行包含两个整数m和n,表…

C++概述——浅谈C++对C的拓展

纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 💬C核心编程一 一.C简介二.第一个程序Hello,world!三.C的特点四.C对C的扩展1️⃣作用域运算符::2️⃣C命名空间(namespace)①名字控制②为什么有…

golang性能分析 pprof的使用 graphviz

golang性能分析 pprof的使用 graphviz 1 参考文档2 pprof、Graphviz介绍3 Graphviz下载 安装4 使用 1 参考文档 参考1:golang性能分析,pprof的使用,graphviz,火焰图 参考2:Golang中的pprof分析环境搭建【Windows环境】…

隆重共建开放,共享未来 | 2023 开放原子全球开源峰会 OpenAtom OpenHarmony 分论坛即将启幕

在全球数字化进程快速发展的背景下,OpenAtom OpenHarmony(以下简称“OpenHarmony”)旨在通过面向全场景、全连接、全智能时代、基于开源的方式,搭建下一代智能终端设备操作系统的框架和平台,为消费、金融、能源、教育、…

光模块失效的原因及预防措施汇总

光模块从生产到使用都必须有规范化的操作方法,任何不规范的动作都可能造成光模块隐性的损伤或者永久的失效,下面就跟着小编来学习一下预防光模块失效的方法吧! 一、光模块失效的主要原因 1、光模块受到静电伤害(ESD损伤)&#xf…

2023 年最新版 Java 后端最全面试攻略,全面对标 BATJ互联网大厂

前言 小编分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#…

爬虫案例-使用Session登录某知名网站(JS逆向AES-CBC加密+MD5加密)

总体概览:使用Session登录该网站,其中包括对password参数进行js逆向破解 (涉及加密:md5加密AES-CBC加密) 难度:两颗星 目标网址:aHR0cHM6Ly93d3cuZnhiYW9nYW8uY29tLw 下面文章将分为四个部分…

证券公司软件测试面试总结分享!

这家公司是做证券项目的,约的9点钟,路程还是有点遥远,转了一趟公交两趟地铁,精力都花在了路上,感觉有点累,以下是今天得面试流程。 到公司前台给我了一张面试表,写完之后就是等待面试。一共面试…

Java开发手册中为什么禁止使用isSuccess作为布尔类型变量名以及POJO中基本类型与包装类型的使用标准

场景 Java开发手册中关于POJO的布尔类型的变量名的要求是: 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。 说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is…

【新版】系统架构设计师 - 知识产权与标准化

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 知识产权与标准化考点摘要保护范围与对象识产权与保护期限知识产权与知识产权人的确定知识产权与侵权判定标准化(标准分类与编号) 架构 - 知识产权与标准化 考点摘要 保护…

JavaSE-06 【面向对象+封装】

JavaSE-06 [面向对象封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程: 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了面向对象: 面向对象是把构成…

windows服务器自带IIS搭建网站并发布公网访问的详细教程

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助,比如…

关于数据生成二维码保存和解密删除二维码

文章目录 前言一、pom配置依赖二、文件引入1.BufferedImageLuminanceSource2.QRCodeUtil3.MyPicConfig4.UploadUtils三、测试前言 所需文件: MyPicConfig 主要解决上传图片实时刷新BufferedImageLuminanceSource 算法文件QRCodeUtil 生成二维码工具类UploadUtils 主要解决上传…

Python中模块的动态导入和自动安装

前言 在 Python 开发中,正确管理和安装所需的第三方模块是至关重要的,但手动处理模块依赖可能会变得繁琐且容易出错。 为了简化这一过程,Python 提供了动态导入和自动安装模块的能力。本文将介绍如何使用动态导入和自动安装模块的方法&#x…

自学黑客技术很难吗?如何自学黑客技术

有人的地方就有江湖,有互联网江湖的地方就有web安全工程师的身影。随着移动互联网的快速发展,网络安全问题成为越来越重要的事情,但由于之前国家对网络安全的不重视,导致网络安全人才严重缺失,所以成为一名网络安全工程…

爱眼护眼的倡导者,康瞳护眼吧引领更多的人关注眼部健康

爱眼护眼的倡导者,康瞳护眼吧引领更多的人关注眼部健康#微信热点#康瞳护眼膏百收网SEO 大家早上好有好消息告诉大家 人民日报连续❷大版面报道📰 关于 ❝青少年近视眼防控的宣传❞ ——降 低近视率迫在眉睫‼️ 轻体营开营倒计时 ⏰⏰3天⏰⏰ 来此一生&#x…

微信小程序实现生成分享海报案例

一、引入插件painter (1)克隆地址:https://gitcode.net/mirrors/Kujiale-Mobile/Painter (2)下载的painter放到小程序的components目录下 二、页面中引入插件 (1)页面的json文件 "using…

最强总结,Python自动化测试-sign签名实战,精品整理...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一般公司对外的接…