算法训练营Day11(栈)

20. 有效的括号

20. 有效的括号 - 力扣(LeetCode)
这道题没看卡哥的视频,我认为我的方法更好一些。

class Solution {
    public boolean isValid(String s) {
        Stack stack = new Stack<>();
        char[] ch = s.toCharArray();
        for (char c : ch){
            if(c=='{'||c=='['||c=='('){
                stack.push(c);
                //{
            }else {
                if(!stack.isEmpty()){
                    if(c=='}'){
                        if(stack.pop()!='{'){
                            return false;
                        }
                    }
                    if(c==')'){
                        if(stack.pop()!='('){
                            return false;
                        }
                    }
                    if(c==']'){
                        if(stack.pop()!='['){
                            return false;
                        }
                    }
                }else {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

优化

class Solution {
    public boolean isValid(String s) {
        Stack stack = new Stack<>();
        char[] ch = s.toCharArray();
        for (char c : ch){
            if(c=='{'||c=='['||c=='('){
                stack.push(c);
                continue;
            }
            if(stack.isEmpty()){
                return false;
            }
            if(c=='}'&&stack.pop()!='{'){
                return false;
            }
            if(c==')'&&stack.pop()!='('){
                return false;
            }
            if(c==']'&&stack.pop()!='['){
                return false;
            }
        }
        return stack.isEmpty();
    }
}

 

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

1047. Remove All Adjacent Duplicates In String - 力扣(LeetCode)

也是自己写的,二刷再看视频吧,有点简单。

class Solution {
  public String removeDuplicates(String s) {
        //"abbaca"
        Stack stack = new Stack<>();
        char[] ch = s.toCharArray();

        for (int i = 0; i < ch.length; i++) {
            if(stack.isEmpty()||ch[i]!=stack.peek()){//aa
                stack.push(ch[i]);
            }else {
                stack.pop();
            }
            //ab

        }
        String str = "";
        //剩余的元素即为不重复的元素
        while (!stack.isEmpty()) {
            str = stack.pop() + str;
        }
        return str;
    }
}

 150. 逆波兰表达式求值 

150. 逆波兰表达式求值 - 力扣(LeetCode)

这个题看的卡哥视频,就是理解一下逆波兰表达式,就是编译原理的一些东西,也就是二叉树的后续遍历。

class Solution {
    public int evalRPN(String[] tokens) {
        // 1+2 * 3 4
        //12 + 34+ *
        //stack:12 3 334 37 21
        Stack stack = new Stack<>();

        for(String s:tokens){
            if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
                int num1 = stack.pop();
                int num2 = stack.pop();
                if(s.equals("+")){
                    stack.push(num1+num2);
                }else if(s.equals("-")){
                    stack.push(num2-num1);
                }else if(s.equals("*")){
                    stack.push(num1*num2);
                }else if(s.equals("/")){
                    stack.push(num2/num1);
                }
            }else {
                    stack.push(Integer.valueOf(s));
                }
        }
        return stack.pop();
    }
}

你可能感兴趣的:(算法)