20230429 -栈与队列2 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

1、20. 有效的括号

在这里插入图片描述

class Solution {
    public boolean isValid(String s) {
        //使用栈,(=>),[=>],{=>},出栈时要满足非空,栈的顶部与要出的相等
        int len = s.length();
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<len;i++){
            char ch = s.charAt(i);
            if(ch == '('){ //注意char是单引号
                stack.push(')');
            }else if(ch=='['){
                stack.push(']');
            }else if(ch=='{'){
                stack.push('}');
            }else if(!stack.isEmpty() && stack.peek() == ch){
                //如果是右括号判断是否和栈顶元素匹配
                //!stack.isEmpty()是防止遇到 "]"
                stack.pop();
            }else{
                return false;
            }
        }
        return stack.isEmpty();
    }
}

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

在这里插入图片描述

class Solution {
    public String removeDuplicates(String s) {
        int len = s.length();
        //进入前先判断peek是否相等,不等就插入
        //相等则出
        //最后剩下的则全部出栈
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<len;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.toString();
        String str = "";
        while(!stack.isEmpty()){
            str = stack.pop()+str;
        }
        return str;
    }
}

3、150. 逆波兰表达式求值

在这里插入图片描述

class Solution {
    public int evalRPN(String[] tokens) {
        //使用堆栈,计算,注意减号和除号时的顺序
        Stack<Integer> stack = new Stack<>();
        for(int i=0;i<tokens.length;i++){
            //找符号进行计算
            String ch = tokens[i];
            if(ch.equals("+")){
                stack.push(stack.pop()+stack.pop());
            }else if(ch.equals("*")){
                stack.push(stack.pop()*stack.pop());
            }else if(ch.equals("-")){
                //注意:正常的temp1-temp2,使用栈时要相反 
                int temp1 = stack.pop(); //后进的
                int temp2 = stack.pop(); //先进的
                stack.push(temp2-temp1); 
            }else if(ch.equals("/")){
                //注意:正常的temp1-temp2,使用栈时要相反 
                int temp1 = stack.pop(); //后进的
                int temp2 = stack.pop(); //先进的
                stack.push(temp2/temp1); 
            }else{
                stack.push(Integer.valueOf(ch));
            }
        }
        return stack.pop();
    }
}

注意减和除的操作

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值