代码随想录day11|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

20. 有效的括号

题目链接

  • 分析:匹配的规则是,创建一个栈,然后遍历一遍字符串,当碰到左括号时,在栈中加入与之匹配的右括号,因为左括号必须以正确的顺序闭合,所以当遍历到右括号时,将其与栈顶元素相比较,如果不相等则不符合规则,直接return false;否则弹出栈顶,比较下一个括号。判断返回true的条件有如下三点:

  • 当左右括号不符合匹配规则时,return false

  • 当字符串未遍历完但是栈已经空时,return false

  • 当字符串已经遍历完了但是栈仍然不为空时,return false

  • 代码:

public boolean isValid(String s) {
    if(s.length() % 2 == 1){
        return false;
    }

    char[] s1 = s.toCharArray();
    Deque<Character> stack = new ArrayDeque<>();
    for(int i = 0; i < s.length(); i++){
        if(s1[i] == '('){
            stack.push(')');
        }else if(s1[i] == '{'){
            stack.push('}');
        }else if(s1[i] == '['){
            stack.push(']');
        }else if(stack.isEmpty() || s1[i] != stack.peek()){
            return false;
        }else{
            stack.pop();
        }
    }

    if(!stack.isEmpty()){
        return false;
    }
    return true;
}

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

题目链接

  • 分析:遍历整个字符串,将当前元素与栈顶元素相比,如果该元素和栈顶元素相同,则弹出栈顶元素并跳过当前遍历的元素继续向后遍历,否则,将该元素加入栈中,最后逆序输出栈中元素组合即可得到答案。

  • 代码:

public String removeDuplicates(String s) {
    char[] s1 = s.toCharArray();
    Deque<Character> stack = new LinkedList<>();
    for(int i = 0; i < s1.length; i++){
        if(stack.isEmpty()){
            stack.push(s1[i]);
            continue;
        }
        char temp = stack.peek();
        if(temp == s1[i]){
            stack.pop();
        }else{
            stack.push(s1[i]);
        }
    }
    char[] result = new char[stack.size()];
    for(int i = result.length - 1; i >= 0; i--){
        result[i] = stack.pop();
    }

    return String.valueOf(result);
}

150. 逆波兰表达式求值

题目链接

  • 分析:整个过程就是,遇见计算符号就弹出两个元素进行相应运算,再将结果压入栈中,最终栈中剩余的元素就是答案。

  • 代码:

public int evalRPN(String[] tokens) {
    Deque<String> stack = new LinkedList<>();
    for(int i = 0; i < tokens.length; i++){
        if(tokens[i].equals("+")){
            int nums1 = Integer.parseInt(stack.pop());
            int nums2 = Integer.parseInt(stack.pop());
            int nums3 = nums1 + nums2;
            stack.push(String.valueOf(nums3));
        }else if(tokens[i].equals("-")){
            int nums1 = Integer.parseInt(stack.pop());
            int nums2 = Integer.parseInt(stack.pop());
            int nums3 = nums2 - nums1;
            stack.push(String.valueOf(nums3));
        }else if(tokens[i].equals("/")){
            int nums1 = Integer.parseInt(stack.pop());
            int nums2 = Integer.parseInt(stack.pop());
            int nums3 = nums2 / nums1;
            stack.push(String.valueOf(nums3));
        }else if(tokens[i].equals("*")){
            int nums1 = Integer.parseInt(stack.pop());
            int nums2 = Integer.parseInt(stack.pop());
            int nums3 = nums2 * nums1;
            stack.push(String.valueOf(nums3));
        }else{
            stack.push(tokens[i]);
        }
    }
    return Integer.parseInt(stack.pop());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值