浅聊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&#…

4、DDD、中台和微服务的关系

DDD、中台和微服务的关系 1 DDD和中台的本质 领域驱动设计&#xff08;DDD&#xff09;和中台在企业架构中有着密切的关系。DDD的本质在于通过对业务领域的深入分析和建模&#xff0c;构建高内聚、低耦合的系统。而中台则是对企业核心业务能力的抽象和封装&#xff0c;以实现…

中英双语介绍美国常春藤联盟( Ivy League):八所高校

中文版 常春藤联盟简介 常春藤联盟&#xff08;Ivy League&#xff09;是美国东北部八所私立大学组成的高校联盟。虽然最初是因体育联盟而得名&#xff0c;但这些学校以其学术卓越、历史悠久、校友杰出而闻名于世。以下是对常春藤联盟的详细介绍&#xff0c;包括其由来、成员…

统一 REST 接口规范:提升低代码平台研发效率

1.背景 在一个低代码研发团队的办公室里&#xff0c;大家正忙碌着。小张在调试组件&#xff0c;小李在优化性能&#xff0c;小王则在制定新项目的技术方案。 这时&#xff0c;团队负责人小刘走进来&#xff0c;对大家说&#xff1a;“我们需要聊聊 REST 接口规范的问题。”他指…

C语言之线程的学习

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

企业为何要进行互联网收口

互联网收口又被称为网络出口收敛或网络出口整合&#xff0c;顾名思义&#xff0c;是通过技术手段将多个网络出口合并为一个或少数几个出口的过程&#xff0c;以优化网络性能、提高安全性和降低运营成本。在本文中&#xff0c;我们将深入探讨企业互联网收口的重要性&#xff0c;…

代码随想录-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…

Codeforces Round955 (Div2)--(A~D)题解

Problem - A - Codeforces 思路&#xff1a;如果领先方互换&#xff0c;那么“NO”&#xff0c;否则“YES”。 void solve(){ Aint x1,y1; cin>>x1>>y1;int x2,y2; cin>>x2>>y2;if(x1>y1&&x2>y2||x1<y1&&…

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

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

【git】存在git LFS文件时如何处理

目录 1. 安装 Git LFS2. 初始化 Git LFS3. 跟踪大文件4. 添加和提交文件5. 克隆和拉取包含 LFS 文件的仓库 1. 安装 Git LFS 首先&#xff0c;你需要在你的系统上安装 Git LFS。你可以使用以下命令来安装&#xff1a; 在 Linux 上 # 对于基于 Debian 的系统 (如 Ubuntu) sud…

k8s 离线部署一个busybox,进而创建cronjob执行任务

首先创建一个yaml&#xff0c;创建一个名字是busybox-test的容器 apiVersion: v1 kind: Pod metadata:name: busybox-testlabels:purpose: demonstrate-busybox spec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand:- sleep- "3600"…

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 是开放源代码的&…

Generator 是怎么样使用的以及各个阶段的变化如何

Generators 是 JavaScript 中一种特殊类型的函数&#xff0c;可以在执行过程中暂停&#xff0c;并且在需要时恢复执行。它们是通过 function* 关键字来定义的。Generator 函数返回的是一个迭代器对象&#xff0c;通过调用该迭代器对象的 next() 方法来控制函数的执行。在调用 n…

houdini 20视窗卡bug脚本开发小记

前情提要&#xff1a;houdini20面世后&#xff0c;体验非常糟糕的就是动不动资产显示不更新了。官方提供重置视窗命令&#xff0c;但设置好的拍屏参数及视窗设置也都会被重置&#xff0c;也就是解决了一个问题又带了一个问题。 所以写个脚本优化一下&#xff0c;大概思路也就是…

微尺度气象数值模拟—大涡模拟技术【WRF-LES模拟、PALM模拟】

针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和人为因素如城市布局紧密相关。在这种规模上&#xff0c;传统的气象模…