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

58 阅读2分钟

有效的括号 LeetCode 20

题目链接:[LeetCode 20 - 简单]

思路

碰到"(" "[" "{" ,在栈中插入相应的另一半。如果碰到后半部分,则栈中元素判断是否相等,并弹出。

Deque:

class Solution {
    public boolean isValid(String s) {
        char ch;
        Deque<Character> deque = new LinkedList<>();
        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();
    }
}

总结

分析一共有三种情况: 1.遍历完字符串但是栈里面非空 -> 左括号多,return false 2.遍历完字符串的过程中,栈里面空了 -> 右括号多,return false 3.遍历完所有数组,栈里面没有对应的字符 -> return false

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

题目链接:[LeetCode 1047 - 简单]

思路

使用栈来解决匹配问题。

ArrayDeque:

class Solution {
    public String removeDuplicates(String s) {
        ArrayDeque<Character> deque = new ArrayDeque<>();
        char ch;

        for(int i=0;i<s.length();i++){
            ch = s.charAt(i);
            if(deque.isEmpty() || deque.peek()!=ch){
                deque.push(ch);
            }else{
                deque.pop();
            }
        }
        String str="";
        while(!deque.isEmpty()){
            str = deque.pop() + str;
        }
        return str;
    }
}

总结

1.使用str = deque.pop() + str;而不是str += deque.pop();的原因为,栈具有先进后出的特性。 2.更高效的题解:

class Solution {
    public String removeDuplicates(String s) {
        char[] cs = s.toCharArray();
        int index = 0;
        for(int i = 0; i < cs.length; i++){ 
            cs[index] = cs[i];
            if(index > 0  && cs[index] == cs[index-1]){
                index--;
            }else{
                index++;
            }
        }
        return new String(cs,0,index);
    }
}

逆波兰表达式求值 LeetCode 150

题目链接:[LeetCode 150 - 中等]

思路

使用栈来解决匹配问题。

ArrayDeque:

class Solution {
    public int evalRPN(String[] tokens) {
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        String ch;
        int num1=0,num2=0;
        for(int i=0;i<tokens.length;i++){
            ch = tokens[i];
            if(!deque.isEmpty() &&  "+".equals(ch)){
                num1 = deque.pop();
                num2 = deque.pop();
                deque.push(num1+num2);
            }else if(!deque.isEmpty() && "-".equals(ch)){
                num1 = deque.pop();
                num2 = deque.pop();
                deque.push(-num1+num2);
            }else if(!deque.isEmpty() && "*".equals(ch)){
                num1 = deque.pop();
                num2 = deque.pop();
                deque.push(num1*num2);
            }else if(!deque.isEmpty() && "/".equals(ch)){
                num1 = deque.pop();
                num2 = deque.pop();
                deque.push(num2/num1);
            }else{
                deque.push(Integer.valueOf(ch));
            }
        }
        return deque.pop();
    }
}

总结

1.为什么使用"-".equals(ch)而不是== :在使用+和*的方法时==会发生错误,发生错误的原因是? 2.num1和num2的顺序问题:-时,num1减数,num2为被减数 -> num2-num1 /时,num1为除数,num2为被除数,num2/num1