代码随想录算法训练营第十一和十二天【栈与队列】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();
    }
}
复制代码

 

posted @   橙子的房东  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示