【算法刷题 | 栈】3.16(有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值)

文章目录

  • 1.有效的括号
    • 1.1题目
    • 1.2解法:栈
  • 2.删除字符串中的所有相邻重复项
    • 2.1题目
    • 2.2解法:栈
  • 3.逆波兰表达式求值
    • 3.1题目
    • 3.2解法:栈

1.有效的括号

1.1题目

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号
  • 示例一:
输入:s = "()"
输出:true
  • 示例二:
输入:s = "()[]{}"
输出:true
  • 示例三:
输入:s = "(]"
输出:false

1.2解法:栈

  1. 题目核心:要求左括号隔壁要有对应的有括号匹配

  2. 讨论三种不匹配的情况

    • 字符串里左方向的括号多余了 ,所以不匹配

      括号匹配1

    • 括号没有多余,但是 括号的类型没有匹配上

      括号匹配2

    • 字符串里右方向的括号多余了,所以不匹配。

  3. 解法:栈

    • 若为左括号,则将对应的右括号入栈
    • 若为右括号,则取出栈顶元素,并判断是否该为右括号类型,不是返回false即可
    • 相当于左括号——>同样类型的右括号进栈;右括号——>出栈(并判断栈顶元素是否为该类型的右括号)
  4. 注意:

    • Java中Deuqe接口进栈方法为 push(i);
    • 查看栈顶元素方法为 peek()
    • 取出栈顶元素方法为 pop()
	public boolean isValid(String s) {
        Deque<Character> deque=new LinkedList<>();
        for(int i=0;i<s.length();i++){
            
            char c=s.charAt(i);
            //1、若为左括号,则将对应的右括号类型进栈
            if(c=='('){
                deque.push(')');
            }else if(c=='{'){
                deque.push('}');
            }else if(c=='['){
                deque.push(']');
            }else if(deque.isEmpty() || deque.peek()!=c){
                //2、右括号,取出栈顶元素并判断是否为该右括号类型
                return false;
            }else{
                deque.pop();
            }
        }

        return deque.isEmpty();
    }

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

2.1题目

给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

  • 示例一:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

2.2解法:栈

  1. 核心:使用栈解法
  2. 若为栈为空或者插入元素与栈顶元素不相同,则插入该元素;否则将栈顶元素出栈
  3. 最后遍历栈,将栈顶元素放置在字符串前面
	public String removeDuplicates(String s) {

        Deque<Character> deque=new LinkedList<>();
        char[] arr=s.toCharArray();
        for(char ch:arr){
            if(deque.isEmpty() || deque.peek()!=ch ){
                deque.push(ch);
            }else{
                deque.pop();
            }
        }
        String str="";
        while(!deque.isEmpty()){
            str=deque.pop()+str;
        }
        return str;
    }

3.逆波兰表达式求值

3.1题目

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*''/'

  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。

  • 两个整数之间的除法总是 向零截断

  • 表达式中不含除零运算。

  • 输入是一个根据逆波兰表示法表示的算术表达式。

  • 答案及所有中间计算结果可以用 32 位 整数表示

  • 示例一:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
  • 示例二:
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
  • 示例三:
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

3.2解法:栈

  1. 核心:使用栈解法

  2. 解析逆波兰表达式:

    ( 1 + 2 ) * ( 3 + 4 )
    
    //逆波兰表达式
     ( ( 1 2 + ) ( 3 4 + ) * ) 
    
  3. 关键:四个关键字符:+、*、-、/:若为上述这个字符,则取出栈顶的两个元素,进行运算之后再放进栈里面

  4. 注意:-、/两个运算的特殊性:若num1为第一个栈顶元素,num2为第二个栈顶元素

    duque.push( num2-num1 )
    
    duque.push( num2/num1 )
    
	public int evalRPN(String[] tokens) {
        Deque<Integer> deque=new LinkedList<>();
        for(String s:tokens){
            if(s.equals("+")){
                deque.push( deque.pop()+deque.pop() );
            }else if(s.equals("*")){
                deque.push( deque.pop()*deque.pop() );
            }else if(s.equals("-")){
                int num1=deque.pop();
                int num2=deque.pop();
                deque.push( num2-num1 );
            }else if(s.equals("/")){
                int num1=deque.pop();
                int num2=deque.pop();
                deque.push( num2/num1);
            }else{
                deque.push(Integer.valueOf(s));
            }
        }
        return deque.pop();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Midjourney绘图欣赏系列(十二)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

element ui 中文离线文档(百度云盘下载)

一般内网开发上不了网&#xff0c;用离线版本比较方便&#xff0c;下载地址&#xff1a; https://download.csdn.net/download/li836779537/88355878?spm1001.2014.3001.5503 下载后里面有个 index.hrml 双击打开就可以用 效果如下&#xff1a;

ADC架构III:Σ-Δ型ADC基础

简介 Σ-Δ型ADC是现代语音频带、音频和高分辨率精密工业测量应用所青睐的转换器。高度数 字架构非常适合现代细线CMOS工艺&#xff0c;因而允许轻松添加数字功能&#xff0c;而又不会显著增加成 本。随着此转换器架构的广泛使用&#xff0c;了解其基本原理显得非常重要。 历…

河南大学大数据平台技术实验报告二

大数据平台技术课程实验报告 实验二&#xff1a;HDFS操作实践 姓名&#xff1a;杨馥瑞 学号&#xff1a;2212080042 专业&#xff1a;数据科学与大数据技术 年级&#xff1a;2022级 主讲教师&#xff1a;林英豪 实验时间&#xff1a;2024年3月15日3点 至 2024年3月15日4点40 …

C#,入门教程(27)——应用程序(Application)的基础知识

上一篇: C#,入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application? 应用程序是编程的结果。一般把代码经过编译(等)过程,最终形成的可执行 或 可再用 的文件称为应用程序。可执行文…

数据结构之顺序表(包学包会版)

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 3.总结 halo&#xff0c;又和大家见面了&#xff0c;今天要给大家分享的是顺序表的知识&#xff0c;跟着我的脚步&#xff0c;包学包会哦~ 规矩不乱&#xff0c;先赞后看&#xff01; ps&#xff1a;&#xff08;孙权…

Android的三种动画详解(帧动画,View动画,属性动画)

Android的三种动画详解&#xff08;帧动画、View动画、属性动画&#xff09;_android动画效果大全-CSDN博客 1、帧动画 缺点是&#xff1a;占用内存较高&#xff0c;播放的是一帧一帧的图片&#xff0c;很少使用。 顺序播放预先定义的图片&#xff0c;类似于播放视频。 步骤…

MySQL语法分类 DDL

DDL(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所有数据库的名称 show datab…

基于ElasticSearch存储海量AIS数据:时空立方体索引篇

文章目录 引言I 时间维切分II 空间范围切分引言 索引结构制约着查询请求的类型和处理方式,索引整体架构制约着查询请求的处理效率。随着时间推移,AIS数据在空间分布上具备局部聚集性,如 果简单地将所有AIS数据插入一个索引结构,随着数据量增长,索引的更新效率、查询效率及…

8508A福禄克(FLUKE)数字多用表

181/2461/8938产品概述&#xff1a; Fluke 8508A 万用表在广泛的测量范围内具有卓越的准确性和稳定性&#xff0c;旨在用作校准实验室的多功能精密测量工具&#xff0c;这些实验室必须满足日益严格的测量不确定性分析要求以及提高生产率的需要。 作为其复杂职责的一部分&…

前端项目,个人笔记(一)【Vue-cli - 定制化主题 + 路由设计】

目录 1、项目准备 1.1、项目初始化 1.2、elementPlus按需引入 注&#xff1a;使用cnpm安装elementplus及两个插件&#xff0c;会报错&#xff1a;vueelement-plus报错TypeError: Cannot read properties of null (reading isCE ) &#xff0c;修改&#xff1a; 测试&#…

SSO 单点登录

什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用间传输声明。它以一种紧凑且自包含的方式安全地在用户和服务之间传递信息&#xff0c;通常用于身份验证和信息交换 为什么要使用JWT 1.传统Se…

解密学习机制:线性回归与梯度下降之旅

摘要 在理解机器学习机制的过程中&#xff0c;我们探讨了在合成数据集上训练简单线性回归模型的过程。整个过程要解决的问题是算法如何通过迭代优化来学习输入和输出变量之间的基本关系。 我们的方法包括生成一个合成线性数据集&#xff0c;实施梯度下降进行参数估计&#xf…

Sonarqube中Java规则与CWE与OWASP的映射关系

很多企业使用Sonarqube社区版作为静态分析工具&#xff0c;在开发阶段检测代码中的缺陷或安全漏洞。但是如果是作为SAST工具厂商&#xff0c;集成该引擎&#xff0c;则需要把Sonarqube中的检测规则与其它引擎的规则进行整合&#xff0c;例如下图&#xff0c;把Sonarqube中的一些…

Spring Cloud Alibaba微服务从入门到进阶(三)(Spring Cloud Alibaba)

Spring Cloud Alibaba是spring Cloud的子项目 Spring Cloud Alibaba的主要组件&#xff08;红框内是开源的&#xff09; Spring Cloud是快速构建分布式系统的工具集&#xff0c; Spring Cloud提供了很多分布式功能 Spring Cloud常用子项目 项目整合 Spring Cloud Alibaba …

Java项目:56 ssm681基于Java的超市管理系统+jsp

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 功能包括:商品分类&#xff0c;供货商管理&#xff0c;库存管理&#xff0c;销售统计&#xff0c;用户及角色管理&#xff0c;等等功能。项目采用mave…

【考研数学】高等数学总结

文章目录 第一章 极限 函数 连续1.1 极限存在准则及两个重要极限1.1.1 夹逼定理1.1.1.1 数列夹逼定理1.1.1.2函数夹逼定理 1.1.2 两个重要极限1.1.2.1 极限公式11.1.2.1.1 证明1.1.2.1.2 数列的单调有界收敛准则1.1.2.1.2.1 二项式定理1.1.2.1.2.2 证明 1.1.2.2 极限公式21.1.2…

【Linux进程信号】信号的发送与保存

【Linux进程信号】信号的发送与保存 目录 【Linux进程信号】信号的发送与保存阻塞信号1. 信号其他相关常见概念2. 在内核中的表示3. sigset_t4. 信号集操作函数sigprocmasksigpendingsignal测试这几个系统调用接口 进程地址空间第三讲捕捉信号1. 内核如何实现信号的捕捉2. siga…

一个能够自我游戏的贪吃蛇(pygame与搜索算法)

贪吃蛇小游戏再经典不过了&#xff0c;作为编程爱好者&#xff0c;代码编译的贪吃蛇&#xff0c;又能有怎样的成绩呢&#xff1f; 带着好奇&#xff0c;开始&#xff01; 先做一个普通的贪吃蛇游戏 引入相关package import pygame 定义相关配置变量 # 定义字体 font pyg…

SQLiteC/C++接口详细介绍之sqlite3类(十六)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十五&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;十七&#xff09;&#xff08;未发表&#xff09; 50.sqlite…