【LeetCode】栈 - 20.有效的括号、150.逆波兰表达式求值、155.最小栈、栈的压入、弹出序列

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:数据结构

在这里插入图片描述

📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。

在这里插入图片描述

文章目录

  • 前言
  • 一、有效的括号
    • 1.题目
    • 2.解析
    • 3.代码展示
  • 二、逆波兰表达式求值
    • 1.题目
    • 2.解析
    • 3.代码展示
  • 三、栈的压入、弹出序列
    • 1.题目
    • 2.解析
    • 3.代码展示
  • 四、最小栈
    • 1.题目
    • 2.解析
    • 3.代码展示
  • 总结

前言

  • 栈、虚拟机栈、栈帧有什么区别呢?
  • 栈 ---- 数据结构
  • 虚拟机栈 ---- JVM内存
  • 栈帧 ---- 调用方法的时候开辟的内存

一、有效的括号

1.题目


20.有效的括号


在这里插入图片描述


2.解析


在这里插入图片描述


3.代码展示


class Solution {//s为字符串public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(int i = 0;i < s.length();i++){char ch = s.charAt(i);//判断是否为左括号if(ch == '(' || ch == '{' ||ch == '['){stack.push(ch);}else{//如果不是左括号//栈为空if(stack.isEmpty()){return false;}//栈不为空//拿到栈顶元素//看是否匹配char tmp = stack.peek();if(tmp == '(' && ch == ')'){stack.pop();}else if(tmp == '{' && ch == '}'){stack.pop();}else if(tmp == '[' && ch == ']'){stack.pop();}else{return false;}}}//字符串遍历完了,栈不为空//例如: ( ( )if(!stack.isEmpty()){return false;}return true;}
}

二、逆波兰表达式求值


1.题目


150.逆波兰表达式求值


在这里插入图片描述


在这里插入图片描述


2.解析


在这里插入图片描述


【说明】

  • 对遍历的每个元素进行判断
  • 如果是数字进行压栈
  • 如果是运算符,依次从栈里面弹出两个元素
  • 进行相对应的运算符操作

主要方法 evalRPN 解析:

  • evalRPN 方法接收一个字符串数组 tokens,每个元素可以是操作数或运算符。
  • 创建一个 Stack 类型的栈 stack,用于存储操作数。
  • 遍历 tokens 数组,对每个元素进行判断:
  • 如果是操作数(通过 isOperation 方法判断是否为运算符),将其转换为整数并压入栈中。
  • 如果是运算符,从栈中弹出两个操作数(注意先弹出的是 num1,后弹出的是 num2,因为栈是先进后出的),根据运算符进行相应的运算,将结果压入栈中。
  • 最终,栈中剩余的唯一元素即为整个表达式的计算结果。

辅助方法 isOperation 解析:

  • isOperation 方法简单地判断字符串是否为 +、-、* 或 / 中的一个,用于区分操作数和运算符。

3.代码展示


class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();// 进行遍历for (int i = 0; i < tokens.length; i++) {String str = tokens[i];if (!isOperations(str)) {// 进行压栈操作// 将字符串转换为整形int val = Integer.valueOf(str);stack.push(val);} else {// 说明是运算符// 取出栈里面的最上面两个元素int num2 = stack.pop();int num1 = stack.pop();// 进行完 运算符操作后 结果进行压栈处理switch (str) {case "+":stack.push(num1 + num2);break;case "-":stack.push(num1 - num2);break;case "*":stack.push(num1 * num2);break;case "/":stack.push(num1 / num2);break;}}}return stack.pop();}/*** 写一个方法,对运算符进行判断*/public boolean isOperations(String str) {if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")) {return true;}return false;}
}

三、栈的压入、弹出序列

1.题目


栈的压入、弹出序列


在这里插入图片描述


2.解析


  • j popV 数组的索引,用于遍历弹出顺序数组。
  • stack 是一个栈,用来模拟入栈和出栈操作。
  • 遍历 pushV 数组,依次将元素压入栈中。
  • 每次入栈后,通过一个 while 循环检查栈顶元素是否与当前 popV 数组指定的弹出顺序相符:
    • 如果栈顶元素与 popV[j] 相等,则执行出栈操作(即弹出栈顶元素),并将 j 向后移动一位。
    • 循环执行直到栈顶元素不再与 popV[j] 相等或者栈为空。
  • 这样可以模拟出栈的过程,检查是否能按照 popV 的顺序完整弹出。
  • 最终判断条件是 j 是否达到了 popV 数组的长度。如果达到了,说明所有的弹出操作都按照正确的顺序进行了,返回 true;否则返回 false。

3.代码展示


import java.util.*;
public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param pushV int整型一维数组* @param popV int整型一维数组* @return bool布尔型*/public boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereint j = 0;Stack<Integer> stack = new Stack<>();for (int i = 0; i < pushV.length; i++) {stack.push(pushV[i]);while (!stack.isEmpty() && j < popV.length && stack.peek() == popV[j]) {stack.pop();j++;}}return j >= popV.length;}
}

四、最小栈

1.题目


155.最小栈


在这里插入图片描述
在这里插入图片描述


2.解析

【注意】
要创建两个栈才能完成 在常数时间内检索


在这里插入图片描述


3.代码展示


class MinStack {// 定义两个栈// 一个正常存元素// 一个存最小的Stack<Integer> stack;Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {// 普通栈必须要放stack.push(val);// 最小栈,刚开始栈为空的时候也要放if (minStack.isEmpty()) {minStack.push(val);} else {if (val <= minStack.peek()) {minStack.push(val);}}}public void pop() {// 从普通栈 弹出int val = stack.pop();// 从最小栈 弹出if (val == minStack.peek()) {minStack.pop();}}public int top() {return stack.peek();}public int getMin() {return minStack.peek();}
}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(val);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.getMin();*/

总结

在 Java 中,Integer.valueOf() Integer.parseInt() 都是用来将字符串转换为整数 (int) 的方法,但它们有一些区别:

返回类型:

  • Integer.valueOf(String str) 返回一个 Integer 对象。
  • Integer.parseInt(String str) 返回一个基本数据类型 int
String str = "123";
Integer valueOfResult = Integer.valueOf(str);  // 返回 Integer 对象
int parseIntResult = Integer.parseInt(str);   // 返回 int 值

缓存机制:

  • Integer.valueOf(String str) 方法内部使用了一个缓存机制,它会缓存整数值在 -128 到 127 范围内的对象实例。因此,对于这个范围内的整数,多次调用 valueOf() 方法会返回相同的对象实例,而不是每次都创建一个新对象。这可以提高性能并节省内存。
  • Integer.parseInt(String str) 方法则没有缓存机制,每次调用都会新建一个 int 类型的值。

异常处理:

  • Integer.valueOf(String str) 方法会抛出 NumberFormatException 异常,如果字符串无法转换为整数。
  • Integer.parseInt(String str) 也会抛出 NumberFormatException 异常,如果字符串无法转换为整数。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【前端/js】使用js读取本地文件(xml、二进制)内容

目录 说在前面FileReaderDOMParser文本文件二进制文件 说在前面 浏览器版本&#xff1a;Microsoft Edge 126.0.2 (正式版本) (64 位) FileReader MDNFileReader 接口允许 Web 应用程序异步读取存储在用户计算机上的文件&#xff08;或原始数据缓冲区&#xff09;的内容&#x…

分布式光伏并网AM5SE-IS防孤岛保护装置介绍——安科瑞 叶西平

产品简介 功能&#xff1a; AM5SE-IS防孤岛保护装置主要适用于35kV、10kV及低压380V光伏发电、燃气发电等新能源并网供电系统。当发生孤岛现象时&#xff0c;可以快速切除并网点&#xff0c;使本站与电网侧快速脱离&#xff0c;保证整个电站和相关维护人员的生命安全。 应用…

模拟实现c++中的vector模版

目录 一vector简述&#xff1a; 二vector的一些接口函数&#xff1a; 1初始化&#xff1a; 2.vector增长&#xff1a; 3vector增删查改&#xff1a; 三vector模拟实现部分主要函数&#xff1a; 1.size,capacity,empty,clear接口&#xff1a; 2.reverse的实现&#xff1…

Golang | Leetcode Golang题解之第292题Nim游戏

题目&#xff1a; 题解&#xff1a; func canWinNim(n int) bool {return n%4 ! 0 }

【一图学技术】SDK和API有什么关系?

API&#xff08;应用程序编程接口&#xff09;&#xff1a; API是一组定义了软件组件之间交互的规则和协议。 它定义了如何请求某个功能或服务&#xff0c;并指定了数据的格式和传输方式。API 可以用于不同的编程语言和平台。 API提供了一种标准化的方式&#xff0c;使不同的应…

[译] 深入浅出Rust基金会

本篇是对 RustConf 2023中的Rust Foundation: Demystified这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 大家好,我是Sage Griffin,我的代词是they/them。我今天来这里是要谈谈Rust基金会。 要了解基金会实际做什么,我们需要理解美国国内税收…

6.3 面向对象技术-设计模式

设计模式 创建型模式 结构型模式

布尔盲注——多种方式实现及利用burpsuite爆破

目录 1、判断闭合符类型 2、爆数据库长度 3、查询库名 手动注入 burpsuite爆破 方法一&#xff1a;用ASCII码值转化爆破 方法二&#xff1a;left方法直接爆破字母 方法三&#xff1a;if方法爆破注入&#xff08;最简单&#xff09; 4、爆破表名 5、爆破具体值 当我们改变前端…

Java | Leetcode Java题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution {public int numSquares(int n) {if (isPerfectSquare(n)) {return 1;}if (checkAnswer4(n)) {return 4;}for (int i 1; i * i < n; i) {int j n - i * i;if (isPerfectSquare(j)) {return 2;}}return 3;}// 判断是否为…

夜不能寐?解锁失眠自救秘籍,让你重拾安睡之夜!

在这个快节奏的时代&#xff0c;失眠似乎成了许多人的“隐形伴侣”&#xff0c;悄悄侵蚀着我们的健康与幸福感。夜深人静&#xff0c;万籁俱寂之时&#xff0c;你却辗转反侧&#xff0c;难以入眠&#xff0c;第二天又拖着疲惫的身躯迎接新的挑战。别担心&#xff0c;今天我们就…

大脑自组织神经网络通俗讲解

大脑自组织神经网络的核心概念 大脑自组织神经网络&#xff0c;是指大脑中的神经元通过自组织的方式形成复杂的网络结构&#xff0c;从而实现信息的处理和存储。这一过程涉及到神经元的生长、连接和重塑&#xff0c;是大脑学习和记忆的基础。其核心公式涉及神经网络的权重更新…

二分法各种边界,大彻大悟

1要考虑四个角度的“边界”&#xff0c;如下图 2 先考虑角度a的第一种情况 如下图所示&#xff0c;对于左边的情况&#xff0c;因为当l3&#xff0c;r4的时候&#xff0c;mid等于3&#xff0c;已知target4, 如果lmid就陷入死循环&#xff0c;所以l。右边同理。 判断c1 c2的影…

热门音效、BGM哪里可以免费下载?

剪辑的奇妙世界等你探索&#xff01;在这个创意的领域里&#xff0c;音效是创造氛围、增强表现力的重要元素。我整理了8个优质的剪辑音效素材网站&#xff0c;它们提供了丰富多样的音效资源&#xff0c;无论是制作视频、音乐还是动画&#xff0c;都能为你提供所需的声音。 1、b…

大模型学习笔记十四:Agent模型微调

文章目录 一、大模型需要Agent技术的原因二、Prompt Engineering可以实现Agent吗&#xff1f;&#xff08;1&#xff09;ReAct原理展示和代码&#xff08;2&#xff09;ModelScope&#xff08;3&#xff09;AutoGPT&#xff08;4&#xff09;ToolLLaMA 三、既然AutoGPT可以满足…

LaTeX如何改变字体颜色

诸神缄默不语-个人CSDN博文目录 在LaTeX文档中&#xff0c;改变字体颜色是一个常见需求&#xff0c;尤其是在需要强调特定文本或使文档更加生动的时候。本文将介绍如何使用\color{}命令来更改字体颜色。 文章目录 基本用法示例代码预定义颜色使用自定义颜色总结本文撰写过程中…

助力樱桃智能自动化采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建果园种植采摘场景下樱桃成熟度智能检测识别系统

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;再到医疗健康&#xff0c;其影响力无处不在。然而&#xff0c;当我们把目光转向中国的农业领域时&#xff0c;一个令人惊讶的…

跟《经济学人》学英文:2024年07月20日这期 A short history of AI

A short history of AI In the first of six weekly briefs, we ask how AI overcame decades of underdelivering 原文&#xff1a; Over the summer of 1956 a small but illustrious group gathered at Dartmouth College in New Hampshire; it included Claude Shannon,…

五、Spring Boot - 上手篇(1)

&#x1f33b;&#x1f33b;目录 一、快速入门&#xff1a;创建第一个SpringBoot 工程1.1 点击File--->New--->Project...1.2 选择版本和依赖的相关骨架包1.3 设置项目保存目录1.4 项目创建完成&#xff0c;工程主界面如下1.5 项目说明1.6 启动项目1.7 编写 HelloControl…

IDEA Maven使用HTTP代理,解决Could not transfer artifact org.xxx问题

文章目录 一、前言二、遇到问题三、分析问题四、HTTP代理五、重新编译验证 一、前言 遇到这个问题&#xff0c;有两种解决办法 IDEA Maven使用HTTP代理&#xff0c;解决Could not transfer artifact org.xxx问题IDEA Maven使用国内镜像&#xff0c;解决Could not transfer arti…