代码随想录算法训练营第十一天| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

 20. 有效的括号

参考文章:代码随想录

参考视频:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili 

解题思路:用栈来去解决问题,需要处理好3种错误的情况。

  1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 括号匹配1

  2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 括号匹配2

  3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 括号匹配3

public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if(!match(stack,s.charAt(i))){
                return false;
            }
        }
        if(!stack.isEmpty()){
            return false;
        }
        return true;
    }

    public static boolean match(Stack<Character> stack, char x) {
        if (x == '(') {
            stack.push(')');
        } else if (x == '[') {
            stack.push(']');
        } else if (x == '{') {
            stack.push('}');
        } else {
            if(stack.isEmpty()){
                return false;
            }else if (x == stack.peek()) {
                stack.pop();
            } else {
                return false;
            }
        }
        return true;
    }

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

参考文章:代码随想录

参考视频:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili

解题思路:用栈的思想来去解决,遍历字符串,当栈最顶层元素与遍历的元素相等时将该元素从栈中弹出,最后得到的栈即是没有相邻重复项的字符串,最后处理返回正序的字符串。

public static String removeDuplicates(String s) {
        Deque<Character> deque = new LinkedList<>();
        for (int i = 0; i < s.length(); i++) {
            if (deque.peek() != null && s.charAt(i) == deque.peek()) {
                deque.pop();
            } else {
                deque.push(s.charAt(i));
            }
        }
        String str = "";
        while (!deque.isEmpty()) {
            str = deque.pop() + str;
        }
        return str;
    }

 150. 逆波兰表达式求值

参考文章:代码随想录 

参考视频:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili 

解题思路:理解好逆波兰表达式是什么意思后其实就很好做题了,当遇到数字时存入栈中,当遇到符号就将栈中最上面两位数拿出来进行该符号的运算,最后栈中的元素即使最终结果。需要注意在处理减法以及除法时候需要特殊处理。

public class Leetcode150 {
    public static int evalRPN(String[] tokens) {
        Deque<Integer> deque = new LinkedList<>();
        for (String token : tokens) {
            if ("+".equals(token)) {
                deque.push(deque.pop() + deque.pop());
            } else if ("-".equals(token)) {
                deque.push(deque.pop() - deque.pop());
            } else if ("*".equals(token)) {
                deque.push(deque.pop() * deque.pop());
            } else if ("/".equals(token)) {
                int a = deque.pop();
                int b = deque.pop();
                deque.push(b / a);
            } else {
                deque.push(Integer.valueOf(token));
            }
        }
        return deque.pop();
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值