浅聊JavaScript中的栈(stack)

前言

这篇文章结合leetcode题目讲解一下栈这种结构

第20题:20. 有效的括号 - 力扣(LeetCode)

第LCR-147题LCR 147. 最小栈 - 力扣(LeetCode)

栈(stack)

在讲解题目之前,我们先来了解一下什么是栈数据结构

具有“后进先出”(Last In First Out,简称 LIFO)的特点

就好比一个桶,你只能从桶的顶部放入和取出元素。最后放入桶中的元素会最先被取出,而最先放入桶中的元素则最后才能被取出

20. 有效的括号 - 力扣(LeetCode)

首先我们来看题目要求:

image.png

这题我们要如何使用栈这种结构去实现题解呢?

首先分析解题要满足的条件

  1. 左括号必须用相同类型的右括号闭合。
    这表示如果长度为奇数就直接返回false,
if(s.length % 2 === 1){return false
}
  1. 左括号必须以正确的顺序闭合。

这表示不会出现"({)}"交叉的结果
3. 每个右括号都有一个对应的相同类型的左括号。

接下来我们就可以去写代码了

var isValid = function(s) {if(s.length % 2 === 1){return false}const data = {'(':')','[':']','{':'}'}const stack = []for(let i = 0; i<s.length; i++){if(s[i] == '(' || s[i] == '[' || s[i] == '{' ){// 将另一半期许入栈stack.push(data[s[i]])}else{// 一定是右括号let r = s[i]let top = stack.pop()if(r !== top){return false}}}return !stack.length
};

函数首先检查字符串的长度,如果长度为奇数则直接返回 false,因为有效的括号组合长度必然是偶数。

然后创建一个对象 data 来存储左括号及其对应的右括号。

接着创建一个空栈 stack 。通过遍历字符串 s ,如果遇到左括号,就将其对应的右括号入栈;如果遇到右括号,就将栈顶元素弹出并与当前右括号进行比较,如果不匹配则返回 false

最后,如果遍历完字符串后栈为空,说明括号匹配有效,返回 true;否则返回 false

LCR 147. 最小栈 - 力扣(LeetCode)

首先我们来看题目要求:

image.png

首先我们使用基础的方法

var MinStack = function() {this.stack = []};MinStack.prototype.push = function(x) {
this.stack.push(x)
};MinStack.prototype.pop = function() {this.stack.pop()
};MinStack.prototype.top = function() {
return this.stack[this.stack.length-1]
};MinStack.prototype.getMin = function() {let min = Infinity;for(let i =0 ; i < this.stack.length; i++){if(this.stack[i]<min){min=this.stack[i]}}
return min
};

这个方法虽然实现了结构,但是并不满足能在常数时间内检索到最小元素的栈这个要求

另一种更高效的实现 getMin 方法的方式是在每次入栈和出栈操作时,同时维护一个最小值变量,这样获取最小值的时间复杂度可以降低到 O(1)

var MinStack = function() {this.stack = []; this.minStack = []; };MinStack.prototype.push = function(x) {this.stack.push(x);if (this.minStack.length === 0 || x <= this.minStack[this.minStack.length - 1]) {this.minStack.push(x); }
};MinStack.prototype.pop = function() {if (this.stack.length > 0) {const popped = this.stack.pop(); if (popped === this.minStack[this.minStack.length - 1]) {this.minStack.pop(); }}
};MinStack.prototype.top = function() {return this.stack[this.stack.length-1]
};MinStack.prototype.getMin = function() {return this.minStack[this.minStack.length - 1]; 
};

这个实现中,使用了两个栈:stack 用于存储实际的元素,minStack 用于跟踪当前栈中的最小值。

  • push 方法:在将元素压入 stack 的同时,如果该元素小于等于 minStack 的栈顶元素(或者 minStack 为空),则将该元素也压入 minStack
  • pop 方法:当弹出 stack 的栈顶元素时,如果该元素等于 minStack 的栈顶元素,就将 minStack 的栈顶元素也弹出。
  • top 方法:返回 stack 的栈顶元素。
  • getMin 方法:返回 minStack 的栈顶元素,即当前栈中的最小值。

这种使用两个栈的方式可以高效地获取栈中的最小值,时间复杂度为 O(1)。

总结

本文详细阐述了栈数据结构,并且通过剖析两道力扣题目,助力大家更深刻地领会栈结构的内涵。

相信读到此处的您必然会有所斩获!!!

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

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

相关文章

HTTPS是什么?原理是什么?用公钥加密为什么不能用公钥解密?

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP的安全版本&#xff0c;它通过在HTTP协议之上加入SSL/TLS协议来实现数据加密传输&#xff0c;确保数据在客户端和服务器之间的传输过程中不会被窃取或篡改。 HTTPS 的工作原理 客户端发起HTTPS请求&…

primetime中cell和net的OCV

文章目录 前言一、Cell OCV1. POCV coefficient file2. POCV Slew-Load Table in Liberty Variation Format&#xff08;LVF lib&#xff09; 二、Net OCV三、如何check OCV是否已加上&#xff1f;总结 前言 在生产中&#xff0c;外界环境的各种变化&#xff0c;比如PVT&#…

C语言之线程的学习

线程属于某一个进程 共同点&#xff1a;都能并发 线程共享变量&#xff0c;进程不共享。 多线程任务中&#xff0c;其中某一个线程调用了exit了&#xff0c;其他线程会跟着一起退出 如果是特定的线程就调用pthread_exit 失败返回的是错误号 下面也是

代码随想录-Day44

322. 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数…

科普文:一文搞懂jvm原理(三)执行引擎

概叙 科普文&#xff1a;一文搞懂jvm(一)jvm概叙-CSDN博客 科普文&#xff1a;一文搞懂jvm原理(二)类加载器-CSDN博客 前面我们介绍了jvm&#xff0c;jvm主要包括两个子系统和两个组件&#xff1a; Class loader(类装载器) 子系统&#xff0c;Execution engine(执行引擎) 子系…

16_C语言编程基础

目录 C语言入门 程序段和代码段 C语言入门实例 英文分号(;) 注释 标识符 保留字 C中的空格 C数据类型 基本类型 sizeof获取存储字节 void类型 变量 C数组 C枚举 C中的左值(lvalue)和右值(rvalue) C常量 变量存储类型 C常用关键字(保留字) 宏定义#define co…

生成式AI:未来商业的变革者

在2023年&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;的浪潮席卷了全球&#xff0c;成为科技领域最炙手可热的话题之一。它不仅改变了我们与机器的互动方式&#xff0c;更在商业创新和生产力提升方面发挥了巨大的作用。本文将深入探讨2024年生成式AI的应用模式、趋…

docker初始化运行mysql容器时自动导入数据库存储过程问题

问题&#xff1a;用navicat导出的数据库脚本&#xff0c;在docker初始化运行mysql容器时&#xff0c;导入到存储过程时出错。 ERROR 1064 (42000) at line 2452: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for t…

面经-数据库

1.MySQL 1.1什么是MySQL? MySQL 是⼀种关系型数据库&#xff0c;在 Java 企业级开发中⾮常常⽤&#xff0c;因为 MySQL 是开源免费的&#xff0c;并 且⽅便扩展。阿⾥巴巴数据库系统也⼤量⽤到了 MySQL &#xff0c;因此它的稳定性是有保障的。 MySQL 是开放源代码的&…

微信小程序-插槽slot

一.插槽slot 在页面使用自定义组件的时候&#xff0c;如果在自定义组件里面写子组件&#xff0c;子组件的内容无法显示。 <custom01> <text slotslot-top>你好&#xff0c;上方组件</text> 你好&#xff0c;组件 <text slotslot-bottom>你好&#xf…

三层限流:为高并发系统保驾护航

文章目录 前言第一层限流&#xff1a;Nginx 层面的 IP 限流第二层限流&#xff1a;Gateway 对用户层级的限流第三层限流&#xff1a;微服务限流分布式限流和单机限流的优缺点&#xff1a;1、RateLimiter的使用2、Hystrix的使用3、Redislua脚本4、使用Sentinel 关于为何同时使用…

做PFMEA的经验之谈

在制造业的广袤领域中&#xff0c;PFMEA&#xff08;过程失效模式与影响分析&#xff09;是一项至关重要的工具&#xff0c;它用于识别并评估生产过程中的潜在失效模式&#xff0c;以及这些失效模式可能导致的后果。作为一名在制造业有多年经验的专业机构&#xff0c;深圳天行健…

安装KB5039212更新卡在25% 或者 96% 进度

系统之家7月1日消息&#xff0c;微软在6月11日的补丁星期二活动中&#xff0c;为Windows 11系统推出了KB5039212更新。然而&#xff0c;部分用户在Windows社区中反映&#xff0c;安装过程中出现失败&#xff0c;进度条在25%或96%时卡住。对于遇到此类问题的Windows 11用户&…

【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现【附完整Matlab代码】 2.改进点 非线性收敛因子 WOA 主要通过控制系数向量 A 来决定鲸鱼是搜索猎物还是捕获猎物&#xff0c;即系数向量 A 可…

【LLM 论文】Self-Refine:使用 feedback 迭代修正 LLM 的 output

论文&#xff1a;Self-Refine: Iterative Refinement with Self-Feedback ⭐⭐⭐⭐ CMU, NeurIPS 2023, arXiv:2303.17651 Code: https://selfrefine.info/ 论文速读 本文提出了 Self-Refine 的 prompt 策略&#xff0c;可以在无需额外训练的情况下&#xff0c;在下游任务上产…

蒂升电梯职业性格和Verify认知能力SHL测评答题攻略及薪资待遇解密!

​一、蒂升电梯职业性格和认知能力测评考什么 您好&#xff01;蒂升电梯公司邀请您参加的OPQ职业性格测评和Verify认知能力测评是两种常见的评估工具&#xff0c;用于帮助了解个人的职场性格特点和认知能力。 OPQ职业性格测评 这是一种性格测试&#xff0c;通常用于评估个人在…

PostgreSQL介绍与安装

一、PostgreSQL数据库介绍 1、什么是数据库&#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也…

倒装COB显示屏与传统SMD显示屏安装方式有哪些不同?

COB显示屏与传统SMD显示屏是商业显示领域中非常重要的两种载体&#xff0c;在前面的文章当中我们为大家阐述了倒装COB显示屏的技术特点&#xff0c;今天跟随COB显示屏厂家深圳市中品瑞科技一起来看看&#xff0c;COB显示屏的安装与传统LED显示屏的安装有哪些不同&#xff1f; 一…

数据结构之“刷链表题”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、相交链表 题目链接 大致思路 代码实现 二、环形链表1 题目链接 大致思路 代码实现 三、环形链表2 题目链接 大致思路 代码实…