代码随想录算法训练营第十天 | 栈与队列 (2)

20. 有效的括号

典中典

需要注意过程中对stack是否为空的检查

以及最后不能直接返回true,而是要看stack是否为空来判断前后括号数量是否一致

public boolean isValid(String s) {
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < s.length(); i++){
        if (s.charAt(i) == '(') stack.push(')');
        else if (s.charAt(i) == '[') stack.push(']');
        else if (s.charAt(i) == '{') stack.push('}');
        else{
            if (stack.isEmpty() || stack.peek() != s.charAt(i)) return false;
            stack.pop();
        }
    }
    return stack.isEmpty();
}

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

此题可以作为例子展示如何使用栈来连续删除重复项

尤其是去除一对重复项之后带来的两边重复问题

本质是对栈用来解决对称性问题的展示

    public String removeDuplicates(String s) {
        if (s == null || s.length() < 2) return s;
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++){
            char ch = s.charAt(i);
            if (!stack.isEmpty() && stack.peek() == ch) stack.pop();
            else stack.push(ch);
        }
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pop());
        }
        return sb.reverse().toString();
    }

150. 逆波兰表达式求值

主要的难点在于想到把每一步二元运算的结果作为一个值压栈

好处在于简化运算过程,不管什么运算符号,都只需要弹栈两个元素进行运算

需要注意对于减法和除法,因为不满足交换律,需要注意第二个弹栈的数为被减数/被除数

public int evalRPN(String[] tokens) {
    Stack<Integer> stack = new Stack<>();
    for (String token: tokens){
        if (!token.equals("+") && !token.equals("-") && !token.equals("*") && !token.equals("/"))
            stack.push(Integer.valueOf(token));
        else{
            int a = stack.pop();
            int b = stack.pop();
            if (token.equals("+")) stack.push(b + a);
            else if (token.equals("-")) stack.push(b - a);
            else if (token.equals("*")) stack.push(b * a);
            else if (token.equals("/")) stack.push(b / a);
        }
    }
    return stack.peek();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值