浅聊JavaScript中的栈(stack)

news2024/11/17 3:31:12

前言

这篇文章结合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.coloradmin.cn/o/1883030.html

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

相关文章

天池大赛Higress插件官方demo详细部署+调试

天池大赛Higress插件官方demo详细部署调试 契机 ⚙ 使用Higress AI网关优化AI调用成本。就是基于向量召回相似问题的缓存&#xff0c;降低LLM API调用成本。就是开发一个网关插件做QA缓存嘛。前文已经成功复现了hello-world插件&#xff0c;这次结合官方提供的AI-Cache插件自…

二叉树遍历练习题

2.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1&#xff0c;中序遍历序列为4 7 5 6 9 1 2&#xff0c;则其后序遍历序列为&#xff08; &#xff09; A.4 2 5 7 6 9 1 B.4 2 7 5 6 9 1 C.4 7 6 1 2 9 5 D.4 7 2 9 5 6 1 答案&#xff1a;C 解析&#xff1a; 通过前序遍历找…

失眠焦虑植物神经紊乱应该怎么改善饮食?

在快节奏的现代社会中&#xff0c;越来越多的人受到植物神经紊乱的困扰&#xff0c;尤其是失眠、焦虑、胸闷气短等症状频发。这些症状不仅影响日常生活和工作效率&#xff0c;还可能引发一系列健康问题。今天&#xff0c;我们就来谈谈如何通过调整饮食来改善这些症状。 饮食调整…

Java [ 基础 ] 方法引用 ✨

✨探索Java基础✨ Java基础&#xff1a;方法引用 方法引用是Java 8中引入的一种新特性&#xff0c;它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的…

HCIA4.26-5.10

OSPF ——开放式最短路径优先协议 无类别链路状态IGP动态路由协议 距离矢量协议 运行距离矢量协议的路由器会周期性的泛洪自己的路由表&#xff0c;通过路由之间的交互&#xff0c;每台路由器都从相邻的路由器学习到路由条目&#xff0c;随后加载进自己的路由表中。对于网络…

简单分享下python封装

目录&#xff1a; 一、简介&#xff0c;什么是封装 二、封装的优点与好处 三、封装的示例 四、可封装的场景 一、简介&#xff0c;什么是封装 通俗理解&#xff1a;封装&#xff0c;简而言之&#xff0c;就是把数据&#xff08;变量&#xff09;和操作这些数据的方法&#xff0…

全球AI新闻速递7.1

全球AI新闻速递 1.科大讯飞发布讯飞星火 V4.0。 2.成都人形机器人创新中心&#xff1a;基于视觉扩散架构的人形机器人任务生成式模型 R-DDPRM。 3.安徽省人形机器人产业创新中心获批&#xff0c;将打造国内首创、世界领先研究基地。 4.亳州牵手华为打造华佗中医药大模型。 …

系统安全及应用(命令)

目录 一、账号安全控制 1.1 系统账号清理 1.2 密码安全控制 1.3 历史记录控制 1.4 终端自动注销 二、系统引导和登陆控制 2.1 限制su命令用户 2.2 PAM安全认证 示例一&#xff1a;通过pam 模块来防止暴力破解ssh 2.3 sudo机制提升权限 2.3.1 sudo命令&#xff08;ro…

SRS流媒体服务器安装与推拉流测试

一、首先打开SRS Github https://github.com/ossrs/srs二、在Linux系统下安装SRS 1. git clone https://github.com/ossrs/srs2、克隆完后进入trunk文件夹 cd srs/trunk3.进行环境配置 ./configure 检测当前环境是否满足 4.进行编译 make 5.编译完成后运行 ./objs/srs …

统计学期末名词解释说明

基本名词解释P值、显著性、显著水平、样本量、三大分布等 20基本名词详细解释&#xff1a; √P值&#xff1a; 相关名词&#xff1a;显著性、显著性差异、0.01水平显著、0.05水平显著。 P值&#xff0c;也称显著性值或者Sig.值&#xff0c;用于描述某件事情发生的概率情况&a…

器件频频更换为哪桩

曾想象&#xff0c;在一家大型研发型企业里有如下案例&#xff1a; 硬件工程师设计电路选择了器件库中的某器件&#xff0c;在批量试产产品时&#xff0c;却发现没有库存&#xff0c;即时申请采购&#xff0c;却发现货期相当长&#xff0c;一时难以采购&#xff0c;甚至根本不…

【ElementPlus源码】Scrollbar 滚动条

文章目录 thumbclickThumbHandlerstartDragmouseMoveDocumentHandlermouseUpDocumentHandlerclickTrackHandler其他 barScrollbar导出的方法noresize更新滚动条相关属性 utilsruntime.tsbuildProps 看源码时候做的笔记。若有问题&#xff0c;请指出&#xff01; 路径相关格式请…

什么是协程?协程和线程的区别

文章目录 前置知识应用程序和内核阻塞和非阻塞同步和异步并发和并行IO 发展历史同步编程异步多线程/进程异步消息 回调函数&#xff08;响应式编程&#xff09; 协程协程基本概念go 示例代码协程和线程的区别 个人简介 前置知识 在了解协程前&#xff0c;我们先理解一些相关的…

VBA数据库解决方案第十二讲:如何判断数据库中数据表是否存在

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

平安养老险陕西分公司参加2024上半年省级单位驻富平帮扶团联席会

6月28日&#xff0c;平安养老险陕西分公司工会副主席武媛携驻村工作队赴富平县庄里镇永安村参加2024上半年度省级单位驻富平帮扶团联席会议。 会议由省委金融办副主任、省委金融工委委员李嘉辉及省委金融办选派挂职干部、富平县副县长席玮共同主持。 会上&#xff0c;席玮县长带…

全球AI新闻速递6.28

全球AI新闻速递 1.首款 Transformer 专用 AI 芯片 Sohu 登场。 2.钉钉&#xff1a;宣布对所有AI大模型厂商开放&#xff0c;首批7家接入。 3.华为联合清华大学发布《AI 终端白皮书》。 4.国家卫生健康委&#xff1a;推动AI技术在制定个性化营养、运动干预方案中的应用。 …

地下水电站3D虚拟仿真展示平台

借助先进的VR技术&#xff0c;我们将水电站的每一个角落、每一处细节都以三维全景的形式真实呈现。您可以自由穿梭于水电站的各个区域&#xff0c;无论是发电机组、巍峨的水坝&#xff0c;还是错综复杂的输水管道&#xff0c;都近在咫尺。感受水流的澎湃力量&#xff0c;聆听机…

中文TeX,各种数学符号和表格

\documentclass{article} \usepackage{amsmath,amssymb,amsfonts} \usepackage{CJKutf8} \begin{document}\begin{CJK}{UTF8}{gkai}%正文放在此行下与\end{CJK}之间就行你好, LaTeX!平方根 $\sqrt{x}$立方根 $\sqrt[3]{x}$分数的代码是 $\frac{a}{b}$求和的代码是 $\sum_{i1}^{…

自闭症儿童能不能用药

在星贝育园自闭症儿童康复学校&#xff0c;我们一直秉持着谨慎且保守的态度对待自闭症儿童的用药问题。我们坚定地认为&#xff0c;在大多数情况下&#xff0c;药物并非自闭症儿童康复的首选。 自闭症是一种神经发育障碍&#xff0c;其核心症状包括社交沟通障碍、重复刻…

API-元素尺寸与位置

学习目标&#xff1a; 掌握元素尺寸与位置 学习内容&#xff1a; 元素尺寸与位置仿京东固定导航栏案例实现bilibili点击小滑块移动效果 元素尺寸与位置&#xff1a; 使用场景&#xff1a; 前面案例滚动多少距离&#xff0c;都是我们自己算的&#xff0c;最好是页面滚动到某个…