代码随想录算法训练营第十一和十二天【栈与队列】20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值
20.有效的括号
心得:栈的经典题目,先进后出,有三种return false的情况。
1)遍历字符串完成,但是栈不为空。说明左括号比右括号多,导致栈中多存了数据
2)遍历字符串中,遍历到的右括号和栈顶的不一致。说明括号的类型没有匹配上
3)遍历字符串中,栈已经为空了。说明右括号比左括号多,栈里少存了数据
拓展:Java中用来表达栈的功能,有两种方式,更推荐Deque。
1)Stack类,从Vector类继承,底层是用数组实现的线程安全的栈。
2)使用双端队列接口Deque,并用实现类ArrayDeque/LinkedList来进行初始化,非线程安全。
Deque<Integer> stack = new ArrayDeque<>();——更推荐
Deque<Integer> stack = new LinkedList<>();
参考文章:
https://blog.csdn.net/linysuccess/article/details/109038453
https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for(int i = 0;i<s.length();i++){ char p = s.charAt(i); if(p == '('){ stack.push(')'); }else if(p == '['){ stack.push(']'); }else if(p == '{'){ stack.push('}'); }else if(stack.isEmpty() || p != stack.peek()){ return false; }else{ stack.pop(); } } return stack.isEmpty(); } }
1047.删除字符串中的所有相邻重复项
心得:最后遍历栈的时候,出栈的字符要拼接在字符串前面。String直接用+连接,效率很低。建议使用stringBuffer.insert(position, string)
class Solution { public String removeDuplicates(String s) { Deque<Character> deque = new ArrayDeque<>(); for(int i=0;i<s.length();i++){ if(deque.isEmpty() || s.charAt(i) != deque.peek()){ deque.push(s.charAt(i)); }else{ deque.pop(); } } StringBuilder st = new StringBuilder(); while(!deque.isEmpty()){ st.insert(0,deque.pop()); } return st.toString(); } }
150.逆波兰表达式求值
心得: 遍历数组,只要元素不是运算符,就加到栈中,遇到运算符,就取出两个数字运算,结果再放到栈里。
1)字符串判断是否相等,string.equals()
2)String转Integer,Integer.valueOf(string)
class Solution { public int evalRPN(String[] tokens) { Deque<Integer> deque = new ArrayDeque<>(); for(String token : tokens){ if("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token)){ int num1 = deque.pop(); int num2 = deque.pop(); if("+".equals(token)){ deque.push(num2 + num1); } if("-".equals(token)){ deque.push(num2 - num1); } if("*".equals(token)){ deque.push(num2 * num1); } if("/".equals(token)){ deque.push(num2 / num1); } }else{ deque.push(Integer.valueOf(token)); } } return deque.pop(); } }
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?