【算法刷题 | 栈】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();}

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

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

相关文章

每日学习笔记:C++ STL 的map、multimap

定义 特点 操作函数 意思就是&#xff0c;使用tuple中的元素来初始化pair&#xff0c;即string(“hello”)、complex(3.4,7.8) 元素的移除讨论

jS 正则

概念 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中&#xff0c;正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。 创建正则表达式 两种方法&#xff1a;字面量方式、构造…

HTML5+CSS3+JS小实例:全屏范围滑块

实例:全屏范围滑块 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…

PHP 生成图片

1.先确认是否有GD库 echo phpinfo(); // 创建一个真彩色图像 $image imagecreatetruecolor(120, 50);// 分配颜色 $bgColor imagecolorallocate($image, 255, 255, 255); // 白色背景 $textColor imagecolorallocate($image, 230, 230, 230); // 黑色文字// 填充背景 image…

【AcWing】蓝桥杯集训每日一题Day5|归并排序|离散化|二分|逆序数对|505.火柴排队(C++)

火柴排队 505. 火柴排队 - AcWing题库难度&#xff1a;中等时/空限制&#xff1a;1s / 128MB总通过数&#xff1a;2058总尝试数&#xff1a;4484来源&#xff1a;NOIP2013提高组算法标签贪心离散化树状数组归并排序 题目内容 涵涵有两盒火柴&#xff0c;每盒装有 n 根火柴…

57、服务攻防——应用协议RsyncSSHRDP漏洞批扫口令猜解

文章目录 口令猜解——Hydra-FTP&RDP&SSH配置不当——未授权访问—Rsync文件备份协议漏洞——应用软件-FTP&Proftpd搭建 口令猜解——Hydra-FTP&RDP&SSH FTP&#xff1a;文本传输协议&#xff0c;端口21&#xff1b;RDP&#xff1a;windows上远程终端协议…

Docker 中 MySQL 的部署与管理

目录 一、Docker 中部署 MySQL1.1 部署 MySQL1.2 进入容器并创建数据库1.3 Navicat 可视化工具连接 二、可能存在的问题2.1 1130 - Host ‘172.17.0.1‘ is not allowed to connect to this MySQL server 参考资料 一、Docker 中部署 MySQL 1.1 部署 MySQL 首先&#xff0c;从…

从零开始利用MATLAB进行FPGA设计(三)将Simulink模型转化为定点数据类型

文章灵感来源于MATLAB官方免费教程&#xff1a;HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢&#xff0c;再加上视频讲解老印浓浓的咖喱味&#xff0c;我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。 往期回顾&am…

回归学术圈,何恺明MIT第一堂AI课

大家好&#xff0c;3月7日&#xff0c;麻省理工学院电气工程与计算机科学系副教授何恺明&#xff0c;迈上讲台&#xff0c;并成功地进行了他人生中的首堂教学课程。 第一堂课 课程官网&#xff1a;https://advances-in-vision.github.io/ 作为麻省理工学院&#xff08;MIT&am…

Golang高效流控实践

流控对于构建高可靠弹性系统至关重要&#xff0c;本文介绍了Golang内置的流控组件&#xff0c;通过该组件就可以打造适合各种业务场景的流控系统。原文: Rate Limiting in Go: Controlling Traffic with Efficiency[1] Jon Cellier Unsplash 导言 流控(Rate limiting)是构建可扩…

springboot“涛宝”大学生二手物品交易商城

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

AlipayHK香港支付宝如何绑定香港卡?

想使用香港支付宝&#xff0c;那需要绑定香港卡&#xff0c;我这里使用的是438357&#xff0c;看下图 开卡地址&#xff0c;点击获取 开卡步骤按照图片步骤即可 这里要注意的是&#xff0c;一定要用香港网络才行&#xff0c;因为每个人的网络环境不一样&#xff0c;自己考虑清…