代码随想录算法训练营DAY11|20.有效的括号|1047.删除字符串中所有相邻元素|150.逆波兰表达式

20.有效的括号

思路:经典的括号匹配。

  • 遇到左括号,弹入栈
  • 遇到右括号,从栈里弹出左括号匹配

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
写起来还是有两个点要考虑的

  • 遇到右括号的时候,弹出左括号之前要对栈判空。'))'这种情况,栈空==没有左括号
  • 最后对栈进行判空,栈空表示左括号都弹出去了,不空表示有左括号没匹配完。
class Solution {
        public boolean isValid(String s) {
        Stack<Character> stack=new Stack<>();
        char[] bracket=s.toCharArray();
        if(s.length()<=1){
            return false;
        }
        for(Character c:bracket){
            if('('==c){//遇到左括号入栈
                stack.push(c);
            }else if('['==c){
                stack.push(c);
            }else if('{'==c){
                stack.push(c);
            }else if(')'==c){//遇到右括号
                //对栈判空
                if(stack.isEmpty()){
                    return false;
                }
                if(!(stack.pop() =='(')){
                    return false;
                }
            }else if(']'==c){//遇到右括号
                //对栈判空
                if(stack.isEmpty()){
                    return false;
                }
                if(!(stack.pop() =='[')){
                    return false;
                }
            }else if('}'==c){//遇到右括号
                //对栈判空
                if(stack.isEmpty()){
                    return false;
                }
                if(!(stack.pop() =='{')){
                    return false;
                }
            }
        }
        if(!stack.isEmpty()){
            return false;
        }
        return true;
    }
}

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

***思路:

  • 维护一个栈,数组元素入栈规则:当前元素与栈顶元素不一样;栈空。
  • 当栈顶元素与当前数组元素一致时,弹出栈顶元素。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
此时数组元素a与栈顶元素a一致,弹出栈里的a。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
最后把栈元素倒出来,反转一下。

class Solution {
     public String removeDuplicates(String s) {
         if("".equals(s)||s==null){
             return "";
         }
        Stack<Character> stack=new Stack<>();
        char[] a=s.toCharArray();
        for(char letter:a){
            //栈不空
            if(!stack.isEmpty()){
                char top=stack.peek();
                //栈顶元素与当前数组元素一致
                if(top==letter){
                    stack.pop();
                }else{
                    stack.push(letter);
                }
            }else{
                stack.push(letter);
            }
        }
       if(stack.isEmpty()){
            return "";
       }
        StringBuilder sb=new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pop());
        }
        return sb.reverse().toString();
    }
}

150.逆波兰表达式

思路:遇到数字入栈,遇到符号,弹出两个数字,“/”和“-”的时候用第二个数字放前面处理。

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();
        for(String token:tokens){
            if("+".equals(token)){
                int number1=stack.pop();
                int number2=stack.pop();
                int temp=number1+number2;
                stack.push(temp);
            }else if("-".equals(token)){
                int number1=stack.pop();
                int number2=stack.pop();
                int temp=number2-number1;
                stack.push(temp);
            }else if("*".equals(token)){
                int number1=stack.pop();
                int number2=stack.pop();
                int temp=number1*number2;
                stack.push(temp);
            }else if("/".equals(token)){
                 int number1=stack.pop();
                int number2=stack.pop();
                int temp=number2/number1;
                stack.push(temp);
            }else{
                stack.push(Integer.parseInt(token));
            }
        }
        return stack.pop();
    }
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值