刷题day10 20有效的括号、1047删除字符串中的所有相邻重复项、150逆波兰表达式求值

一、有效的括号

 这道题主要是明确以下三种情况

首先判断字符串的长度是不是偶数,如果不是偶数那么就直接返回false,因为再怎么说也是成双成对的括号,

之后就是正常进入循环,如果匹配到有左括号的,直接把右括号压入栈

但是遇到不匹配的或者说要匹配栈中为空了,那这不行,要返回false

遇到相等的就直接压出栈

最后都匹配完事儿,再判断一下栈中是否为空,如果不为空还是返回的false

代码如下:

class Solution {
    public boolean isValid(String s) {
        Stack<Character> sta = new Stack<>();

        if(s.length() % 2 != 0)
            return false;
        
        for(int i = 0;i<s.length();i++)
        {
            if(s.charAt(i) == '('){
                sta.push(')');
            }else if(s.charAt(i) == '{'){
                sta.push('}');
            }else if(s.charAt(i) == '['){
                sta.push(']');
            }else if(sta.isEmpty()||sta.peek()!=s.charAt(i)){
                return false;
            }
            else sta.pop();
        }

        return sta.isEmpty();
    }
}

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

这道题普及了很多的概念,比如说length()方法是String类的,size()方法是char类型 栈类型可以用的,然后charAt()方法是string字符串才可以用的,

创建字符串类可以使用ArrayList<Character> ch = new ArrayList<>();他往数组中添加元素是用ch.add(x)来添加的

创建动态的字符串数组,是用StringBuilder  result = new StringBuilder(); 来创建的,他往字符串数组中添加元素是使用result.append(x)来添加的

然后增强for循环for(char ch:sta){ result.append(ch); } 还有就是要最后把StringBuilder的字符序列转换成字符串用return result.toString();

还有注意创建栈的时候返回的元素是char型的就是要用Stack<Character> sta = new Stack<>();

这道题和上一道题是差不多的思想,元素按顺序入栈,然后相邻的相同的元素入站的时候比较,相同就弹出,最后创建字符序列组来保存栈底到栈顶的字符,最后把字符序列转换成字符串返回

代码如下:

class Solution {
    public String removeDuplicates(String s) {
            Stack<Character> sta = new Stack<>();

            if(s.length() == 0)
                return "";
            
            for(int i = 0;i<s.length();i++)
            {
               char ch1 = s.charAt(i);
               if(!sta.isEmpty() && ch1 == sta.peek()){
                    sta.pop();
               }else{
                sta.push(ch1);
               }
            }
            // ArrayList<Character> ch = new ArrayList<>();
           StringBuilder str = new StringBuilder();
           for(char ch:sta){
                str.append(ch);
           }

           return str.toString();
           
    }
}

三、150逆波兰表达式求值

这道题主要是明白这种计算是怎么做的,这道题后边可以用后序遍历二叉树(左右根)的方法,但是在这里可以用栈的方法,栈用在这里也是恰到好处,因为咱们只需要把那些字符数字放入栈里,然后遇到一个运算符就把栈顶前两个数进行运算操作,操作后的结果再压入栈中,最后返回栈顶的元素就是最终的结果

在做这道题的时候需要注意两个点:首先第一个点是咱们可以拿Deque<Integer> sta = new LinkedList<>()来模拟栈,也就是栈,他也有栈的那些方法

然后就是在最后将数字压入栈的时候,需要将字符串转换为整数,有两种方法可以进行转换
第一种是Integer类的parseInt的方法,这个返回的类型是int型
还有一种是Integer类的valueOf方法,这个返回的类型是Integer对象,是int型的包装类

然后还需要注意的就是字符串中匹配可以使用.equals()方法

代码如下:

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

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值