Day11:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项、150. 逆波兰表达式求值

本文主要是介绍Day11:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项、150. 逆波兰表达式求值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://blog.csdn.net/weixin_43303286/article/details/131869968?spm=1001.2014.3001.5501

  1. 有效的括号

遇见左括号对应的右括号进栈,遇到右括号看栈顶,不相同就返回false

class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(char ch : s.toCharArray()){if(ch == '{') {stack.push('}');}else if(ch == '('){stack.push(')');}else if(ch == '['){stack.push(']');}else{if(!stack.empty()){if(stack.peek() != ch){return false;}else{stack.pop();}}else{return false;}}}return stack.empty();}}

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

就是消消乐思想,栈的拿手好戏,可以直接声明stack,也可以用字符串当作栈:

在Java中,Deque(双端队列)通常被用作栈的实现,而不是Stack类,主要有以下几个原因:

Stack类是Java早期版本中的遗留类,它继承自Vector类,而Vector类的所有方法都是同步的,这意味着它在多线程环境下的性能较差。

Deque接口提供了更丰富和一致的接口。例如,Deque提供了addFirst、addLast、removeFirst、removeLast等方法,这使得它既可以作为栈(先进后出)使用,也可以作为队列(先进先出)使用。

Deque接口的实现类,如ArrayDeque,通常比Stack类具有更好的性能。

class Solution {public String removeDuplicates(String s) {Stack<Character> sb = new Stack<>();StringBuilder sb1 = new StringBuilder();for (int i = 0; i < s.length(); i++) {if(sb.isEmpty() || sb.peek()!= s.charAt(i)){sb.push(s.charAt(i));}else{sb.pop();}}while(!sb.empty()){sb1.append(sb.pop());}return sb1.reverse().toString();}
}
  • 翻转字符串:StringBuilder的reverse()
  • 使用Deque的代码:
class Solution {public String removeDuplicates(String S) {//ArrayDeque会比LinkedList在除了删除元素这一点外会快一点//参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlistArrayDeque<Character> deque = new ArrayDeque<>();char ch;for (int i = 0; i < S.length(); i++) {ch = S.charAt(i);if (deque.isEmpty() || deque.peek() != ch) {deque.push(ch);} else {deque.pop();}}String str = "";//剩余的元素即为不重复的元素while (!deque.isEmpty()) {str = deque.pop() + str;}return str;}
}
  • 直接用字符串当栈:
class Solution {public String removeDuplicates(String s) {// 将 res 当做栈// 也可以用 StringBuilder 来修改字符串,速度更快// StringBuilder res = new StringBuilder();StringBuffer res = new StringBuffer();// top为 res 的长度int top = -1;for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 当 top > 0,即栈中有字符时,当前字符如果和栈中字符相等,弹出栈顶字符,同时 top--if (top >= 0 && res.charAt(top) == c) {res.deleteCharAt(top);top--;// 否则,将该字符 入栈,同时top++} else {res.append(c);top++;}}return res.toString();}
}

150. 逆波兰表达式求值

注意-和/有顺序要求。

class Solution {public int evalRPN(String[] tokens) {Deque<Integer> nums = new ArrayDeque<>();//用来存数字for(String s: tokens){if(Objects.equals(s, "+")){nums.push(nums.pop() + nums.pop());}else if(Objects.equals(s, "-")){int a = nums.pop();int b = nums.pop();nums.push(b - a);}else if(Objects.equals(s, "*")){nums.push(nums.pop() * nums.pop());}else if(Objects.equals(s, "/")){int a = nums.pop();int b = nums.pop();nums.push(b / a);}else{nums.push(Integer.parseInt(s));}}return nums.peek();}
  • Integer.parseInt(s)字符串转数字

这篇关于Day11:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项、150. 逆波兰表达式求值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817396

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方