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

文章介绍了如何使用栈解决有效括号问题,通过遍历和匹配括号来检查字符串是否合法。另外,还展示了利用Deque删除字符串中的相邻重复项以及解决逆波兰表达式求值问题,强调了数据结构在算法中的应用和优化代码的重要性。
摘要由CSDN通过智能技术生成


20. 有效的括号

1、代码1

class Solution {
    public boolean isValid(String s) {
        char[] ch = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        //1、括号类型不匹配
        //2、左边多括号
        //3、右边多括号
        for(int i=0; i<s.length(); i++){
            if(ch[i] == '('){
                stack.push(')');
            }
            if(ch[i] == '['){
                stack.push(']');
            }
            if(ch[i] == '{'){
                stack.push('}');
            }
            if(ch[i] == ')'){
                if(!stack.isEmpty() && stack.pop() == ')'){
                    continue;
                }else{
                    return false;
                }
            }
            if(ch[i] == ']'){
                if(!stack.isEmpty() && stack.pop() == ']'){
                    continue;
                }else{
                    return false;
                }
            }
            if(ch[i] == '}'){
                if(!stack.isEmpty() && stack.pop() == '}'){
                    continue;
                }else{
                    return false;
                }
            }
        }
        if(!stack.isEmpty()){
            return false;
        }
        return true;
    }
}

2、分析

(1)**栈主要解决的是对称匹配类问题。**匹配指循环遍历的元素在后面遍历的时候需要用到,于是元素出栈完成匹配。主要思路都是遍历入栈,需要的时候拿出来进行计算之后再入栈。
(2)**动手之前需要分析好题目。**看到题没有从更高的角度入手容易顾此失彼。
(3)代码:

!stack.isEmpty() && stack.pop() == '}'

正如链表一样,数据结构在进行操作时要注意该数据结构是否已经为空,否则会发生编译错误。

3、代码2

class Solution {
    public boolean isValid(String s) {
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for(int i=0; i<s.length(); i++){
            ch = s.charAt(i);
            if(ch == '('){
                deque.push(')');
            }else if(ch == '['){
                deque.push(']');
            }else if(ch == '{'){
                deque.push('}');
            }else if(deque.isEmpty() || deque.peek()!= ch){
                return false;
            }else{
                deque.pop();
            }
        }
        return deque.isEmpty();
    }
}

4、分析

(1)Deque可以运用于栈和队列。
(2)代码:

 }else if(deque.isEmpty() || deque.peek()!= ch){

左边表达式解决了左括号多余的情况,右表达式解决了括号类型不匹配的情况,

      return deque.isEmpty();

return语句解决了右括号多余的情况。
(3)代码1中可以发现右括号匹配的时候有大量冗余代码,由于都是判断栈顶元素,所以直接用peek()函数判断与遍历的元素是否相等,简洁了代码。
(4)有时候对于结果的判断也可以直接写到return语句里面,而不用再写一个if判断来决定返回值的值,可以简化代码。

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

1、代码

class Solution {
    public String removeDuplicates(String s) {
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for(int i=0; i<s.length(); i++){
            ch = s.charAt(i);
            if(!deque.isEmpty() && deque.peek() == ch){
                deque.pop();
            }else{
                deque.push(ch);
            }
        }
        String str = "";
        while(!deque.isEmpty()){
            str = deque.pop() + str;//
        }
        return str;
    }
}

2、分析

(1)技巧:当需要返回的字符串都在数据结构(栈)里面的时候,可以建立一个空字符串,通过循环进行字符串值的叠加。

        String str = "";
        while(!deque.isEmpty()){
            str = deque.pop() + str;
        }
        return str;

150. 逆波兰表达式求值

1、代码

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(int i=0; i<tokens.length; i++){
            if("+".equals(tokens[i])){
                stack.push(stack.pop() + stack.pop());
            }else if("-".equals(tokens[i])){
                stack.push(-stack.pop() + stack.pop());
            }else if("*".equals(tokens[i])){
                stack.push(stack.pop() * stack.pop());
            }else if("/".equals(tokens[i])){
                int temp = stack.pop();
                int temp1 = stack.pop();
                stack.push(temp1 / temp);
            }else{
                // stack.push(tokens[i]);
                //把字符串转化为整数类型
                stack.push(Integer.valueOf(tokens[i]));
            }
        }
        return stack.peek();
    }
}

2、分析

(1)代码:

Integer.valueOf(tokens[i])

技巧:该api将字符串类型转化为整型类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值