算法练习 Day11 | leetcode 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

一、算法题

20. 有效的括号

题目链接

class Solution {
    public boolean isValid(String s) {
        Stack<Character> sn=new Stack<>();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(c=='('||c=='{'||c=='['){
                sn.push(c);
            }
            else {
                //此时字符是右括号,如果此时栈里面为空,说明一定遇不到能与之匹配的左括号,所以return false
                if(sn.isEmpty()){
                    return false;
                }
                //此时已经弹出了左括号
                char a=sn.pop();
                //左右括号不匹配的现象
                if(c==')'&&a!='('){
                    return false;
                }
                if(c=='}'&&a!='{'){
                    return false;
                }
                if(c==']'&&a!='['){
                    return false;
                }
            }
        }
        //如果都能匹配成功,最后栈一定是空的,只要不为空就肯定出错
        //包括左括号多余的情况
    return sn.isEmpty();
}
}

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

题目链接

class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> sn=new Stack<>();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(sn.isEmpty()){
                sn.push(c);
            }else{
                if(c==sn.peek()){
                    sn.pop();
                }else{
                    sn.push(c);
                }
            }
        }
        String str="";
        while(!sn.isEmpty()){
            str+=sn.pop();
        }
        StringBuilder sb=new StringBuilder(str);
        return sb.reverse().toString();

    }
}
  • 当最后栈里面保留的是目标答案的翻转,要得到正确答案先得把这个字符串翻转过来
  • 所以使用了StringBuilder的reverse()方法

150. 逆波兰表达式求值

题目链接

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> sn=new Stack<>();
        for(String s:tokens){
            if("+".equals(s)){
                sn.push(sn.pop()+sn.pop());
            }else if("-".equals(s)){
                //先被pop出去的是被减数
                sn.push(-sn.pop()+sn.pop());
            }else if("*".equals(s)){
                sn.push(sn.pop()*sn.pop());
            }else if("/".equals(s)){
                int down=sn.pop();
                int up=sn.pop();
                sn.push(up/down);
            }else {
                //在加入数字元素时要转换为Integer
                //其他加减乘除处理的都是Integer类型的栈sn里的元素
                sn.push(Integer.valueOf(s));
            }
        }
        return sn.peek();

    }
}

逆波兰表达式

  • 又叫后缀表达式
  • 在后缀表达式中,操作符位于操作数之后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值