代码随想录:栈与队列4-6

news2024/10/6 16:18:51

20.有效的括号

题目

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

代码

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        
        for(int i=0; i < s.length(); i++){
            char c = s.charAt(i);
            //如果是左括号,就让对应匹配的右括号进栈
            if(c == '('){
                stack.push(')');
            }
            else if(c == '{'){
                stack.push('}');
            }
            else if(c == '['){
                stack.push(']');
            }
            //如果是右括号,如果此时栈已经空了,说明右括号多了,返回false
            //如果是右括号,如果左右括号不匹配,返回false
            else if(stack.isEmpty() || c != stack.peek()){
                return false;
            }
            //左右括号匹配,栈顶元素出栈
            else{
                stack.pop();
            }
        }
        //如果结束后栈非空,说明左括号多了,也要return false
        return stack.isEmpty();
    }
}

总结

1.思想

        要判断左右括号匹配,优先用栈来解决。

        大致算法是,如果是左括号就让其进栈,如果是右括号就把栈顶元素取出来匹配一下,如果不匹配就返回false,匹配就把栈底元素出栈。不过要把所有不匹配的情况考虑清楚:

(1)第一种:左括号多,那么for循环结束之后的栈是非空的

(2)第二种:右括号多,那么遍历到右括号时栈已经是空了

(3)第三种就:左右括号数量匹配但是内容不匹配。

        还有要想一下,如何做左右括号的匹配,其实就是让左括号进栈的时候,替换为对应的右括号就行。

2.算法流程

        用for循环遍历字符串,如果当前元素是左括号“(、{、[ ”,就分别使用三个if分支语句,让其对应的右括号“)、}、] ”进栈。

        如果当前元素已经不是上面3种左括号,已经是右括号了,要判断2种情况,如果此时的栈已经是空的,就代表右括号太多,要返回false,或者如果此时的左右括号不匹配,也要返回false。如果上面的情况都不满足,说明左右括号是匹配的,把栈顶元素pop出来。

        最后,判断栈是否为空,看看左括号是不是太多了就行。

1047.删除字符串中的所有相邻重复项

题目

        给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:"abbaca"
输出:"ca"

代码

class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();

        for(int i=0;i < s.length(); i++){
            char c = s.charAt(i);
            //如果栈是空的,或者栈不空但是栈顶元素!=当前元素
            if(stack.isEmpty() || stack.peek() != c){
                stack.push(c); //当前元素入栈
            }
            //如果栈非空,且栈顶元素==当前元素
            else{
                stack.pop(); //栈顶元素出栈
            }
        }

        StringBuilder sb = new StringBuilder();
        //把最终的栈元素从栈顶开始输出
        while(!stack.isEmpty()){
            sb.append(stack.pop());
        }

        //出栈顺序和我们要的结果相反,要把结果字符串反转一下再转为String类型
        return sb.reverse().toString();

    }
}

总结

1.思想

        字符串删除重复元素也是一种变相的括号匹配问题。核心思路如下:

        如果栈是空的或者栈顶元素和当前元素不相同,就把当前元素入栈。

        如果栈顶元素等于当前元素,就把栈顶出栈。最后遍历完String后,栈内剩余的就是我们要的不重复的字符串。

2.算法流程

        for循环遍历字符串,获取当前元素c,如果当前栈是空或者栈顶peek元素不等于c,就把当前元素c入栈push到栈中,如果栈顶peek元素等于c,就把栈顶元素pop出来。for循环结束后,栈中剩余的元素就是我们要的结果集,把他们一个个出栈存到字符串里就行。

3.注意点

        由于最后结果集出栈的时候,出栈的字符顺序和我们要的是相反的,所以当栈不空时,可以循环用StringBuild逐个append出栈元素,最后再返回sb.reverse().toString()就行。

150.逆波兰表达式求值

题目

        给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

代码

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();

        for(String s : tokens){
            //如果是算法符合,就把栈顶的两个元素pop出来,计算后再push回去
            if(s.equals("+")){
                int x2 = stack.pop();
                int x1 = stack.pop();
                stack.push(x1 + x2);
            }
            else if(s.equals("-")){
                int x2 = stack.pop();
                int x1 = stack.pop();
                stack.push(x1 - x2);
            }
            else if(s.equals("*")){
                int x2 = stack.pop();
                int x1 = stack.pop();
                stack.push(x1 * x2);
            }
            else if(s.equals("/")){
                int x2 = stack.pop();
                int x1 = stack.pop();
                stack.push(x1 / x2);
            }
            //如果s不是算术符号,s是数字,就把s转为Integer再push进去
            else{
                stack.push(Integer.valueOf(s));
            }
        }
        //最后栈内的元素就是计算结果
        return stack.pop();
    }
}

总结

1.思想

        逆波兰表达式就是把数字写前面,计算符号写后面的一种计算式。它的计算方法是,如果遇到计算符号,就把该计算符号的前两个数字用该符号进行计算,直到用完每一个计算符号。因此,我们可以用栈存储数字,遇到计算符号,就把栈顶的两个数字出栈计算,计算完再入栈。

2.算法流程

        遍历String数组,如果当前字符串s是“+”,就把栈顶的两个元素pop出来,用x2和x1存储,计算x1+x2结果,把x1+x2再push进栈。其他的“-”、“*”、“/”原理一样,再写三个else语句就行。

        如果当前字符串s是数字,就把s转为Integer整型后push到栈中。最后栈内的元素就是计算结果。

3.注意点

(1)出栈获取两个x1和x2计算时,第一个出栈元素是x2,第二个出栈元素是x1,计算时x1在前x2在后,不能反过来哦。

(2)这里的tokens是字符串数组,不是字符串,因此遍历时,有下面两种方式:

        ①用String进行增强for,写法是String s : tokens

        ②用普通的for,写法是for(int i=0; i < tokens.length; i++) ,然后String s = tokens[i];

如果是String字符串,而不是字符串数组,才能用下面这种写法:

4.语法点

(1)判断两个字符串是否相同,要用s1.equals(s2)。判断字符char是否相同,才能用==。

(2)把String转为Integer,用Integer i = Integer.valueOf(str),注意O要大写。

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

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

相关文章

OpenHarmony分布式软总线API调用测试工具 softbus_tool使用说明

softbus_tool 是 OpenHarmony 分布式软总线 API 调用测试工具&#xff0c;文件结构如下图所示。 softbus_tool 能够将软总线 interfaces 目录下的一些常用接口集中起来&#xff0c;供设备间搭建一些场景时使用&#xff08;比如设备绑定、BR 组网&#xff0c;BLE 组网&#xff…

红豆Cat 1开源|项目三: 从0-1设计一款HTTP版本RTU(支持GNSS)产品的软硬件全过程

HTTP版RTU&#xff08;支持GNSS&#xff09;项目概述 RTU&#xff08;Remote Terminal Unit&#xff09;&#xff0c;中文即远程终端控制系统&#xff0c;负责对现场信号、工业设备的监测和控制。RTU是构成企业综合自动化系统的核心装置&#xff0c;通常由信号输入/出模块、微…

ArrayList中多线程的不安全问题

ArrayList中的不安全问题 正常的输出 List<String> list Arrays.asList("1","2","3"); list.forEach(System.out::println);为什么可以这样输出&#xff0c;是一种函数是接口&#xff0c;我们先过个耳熟 Arrys.asList是返回一个ArrayL…

Redis高级-分布式缓存RDB原理

分布式缓存 1.1.2.RDB原理 bgsave开始时会fork主进程得到子进程&#xff0c;子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。 fork采用的是copy-on-write技术&#xff1a; 当主进程执行读操作时&#xff0c;访问共享内存&#xff1b;当主进程执行写操…

振弦式应变计在岩土工程中的应用

岩土工程是土木工程的一个重要分支&#xff0c;主要研究岩石、土壤等天然材料的工程特性及其在工程中的应用。它涉及地基基础、边坡工程、隧道工程、水利水电工程等众多领域&#xff0c;是保障建筑物安全、稳定的基础性工程。 点击输入图片描述&#xff08;最多30字&#xff09…

rabbitmq延迟队列的使用

rabbitmq延迟队列的使用 1、场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&a…

再也不怕面试官问 OOM了,一次生产环境 Metaspace OOM 排查流程实操!

问题背景 小奎公司的运维同时今天反映核心业务一个服务目前 CPU 的使用率、堆内存、非堆内存的使用率有点高。刚反映没有过多久该服务就直接 OOM 了&#xff0c;以下是生产监控平台监控信息。 CPU 使用率监控 堆内存和非堆内存使用率 OOM 产生的日志报错信息 问题分析 根…

kali使用msf+apkhook520+cploar实现安卓手的攻击

学习网络安全的过程中&#xff0c;突发奇想怎么才能控制或者说是攻击手机 边找工作边实验 话不多说启动kali 一、使用msfapktool生成简单的木马程序 首先使用kali自带的msfvenom写上这样一段代码 选择安卓 kali的ip 一个空闲的端口 要输出的文件名 msfvenom -p android/met…

9个最受欢迎的开源自动化测试框架盘点!

自动化测试框架可以帮助测试人员评估多个Web和移动应用程序的功能&#xff0c;安全性&#xff0c;可用性和可访问性。尽管团队可以自己构建复杂的自动化测试框架&#xff0c;但是当他们可以使用现有的开源工具&#xff0c;库和测试框架获得相同甚至更好的结果时&#xff0c;通常…

ubuntu系统逻辑卷Logical Volume扩容根分区

Linux LVM详解 https://blog.csdn.net/qq_35745940/article/details/119054949 https://blog.csdn.net/weixin_41891696/article/details/118805670 https://blog.51cto.com/woyaoxuelinux/1870299 LVM&#xff08;Logical Volume Manager&#xff09;逻辑卷管理&#xff0c…

C++入门语法(命名空间缺省函数函数重载引用内联函数nullptr)

目录 前言 1. 什么是C 2. C关键字 3. 命名空间 3.1 命名空间的定义 3.2 命名空间的使用 4. C输入和输出 5. 缺省函数 5.1 概念 5.2 缺省参数分类 6. 函数重载 6.1 概念 6.2 为何C支持函数重载 7. 引用 7.1 概念 7.2 特性 7.3 常引用 7.4 引用与指针的区别 7…

OSCP靶场--Hetemit

OSCP靶场–Hetemit 考点(python代码注入 systemctrl提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.117 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-10 05:52 EDT Nmap scan report for 192.168.1…

详解多态、虚继承、多重继承内存布局及虚表(C++)

本篇文章深入分析多态、虚继承、多重继承的内存布局及虚函数表以及实现原理。编译器使用VS 2022&#xff0c;直接放结论&#xff0c;代码及内存调试信息在后文。 结论 内存布局 一个没有虚函数的类&#xff0c;它的大小其实就是所有成员变量的大小&#xff0c;此时它就是一个…

13 指针(上)

指针是 C 语言最重要的概念之一&#xff0c;也是最难理解的概念之一。 指针是C语言的精髓&#xff0c;要想掌握C语言就需要深入地了解指针。 指针类型在考研中用得最多的地方&#xff0c;就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。 本章专题脉络 1、指针…

redis string底层为什么使用sds, sds好处?redis 的动态字符串优点?

1. redis 的键值对&#xff0c;都是由对象组成的&#xff0c; 其中键总是一个字符串对象&#xff08;string object&#xff09; 而键的value则可以是&#xff1a;“字符串对象”&#xff0c; “列表对象 &#xff08;list object&#xff09;”&#xff0c;“哈希对象 (hash o…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.3 月末操作:外币评估

2.6.3 月末操作&#xff1a;外币评估 企业的外币业务在记账时一般使用期初的汇率或者即时汇率&#xff0c;但在月末&#xff0c;需要按照月末汇率对外币的余额或者未清项进行重估&#xff08;revaluation&#xff09;。 企业在资产负债表日&#xff0c;应当按照下列规…

nandgame中的Code generation(代码生成)

题目说明&#xff1a; 代码生成为语言的语法规则定义代码生成&#xff0c;以支持加法和减法。 您可以使用在前面级别中定义的堆栈操作&#xff08;如ADD和SUB&#xff09;。代码生成模板通常需要包含规则中其他符号的代码。 这些可以通过方括号中的符号名称插入。例如&#xf…

【初中生讲机器学习】15. EM 算法一万字详解!一起来学!

创建时间&#xff1a;2024-04-08 最后编辑时间&#xff1a;2024-04-10 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

西门子PLC(S7-200 SMART)学习笔记1:初识PLC可编程逻辑器件

今日开始我的西门子PLC学习之路&#xff0c;学习的型号以S7-200 SMART为主 主要认识一下PLC是什么、型号怎么看、 通信相关、编程软件、构造及工作原理 目录 西门子官方PLC手册获取&#xff1a; 1、PLC可编程逻辑器件的基本认识&#xff1a; PLC的结构及各部分的作用&#xff…

Kali安装黑屏与进入系统后不显示中文的解决办法

使用镜像版本kali-linux-2024.1-installer-amd64.iso 一.创建虚拟机安装Kali镜像时&#xff0c;安装后要重启时发现左上角有个— 闪动并黑屏&#xff0c;启动不成功 上述办法也很简单&#xff0c;可以试试再windows中的CMD终端输入netsh winsock reset&#xff0c;重启电脑如果…