算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

58 阅读1分钟

20. 有效的括号

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

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

注意是删除所有相邻重复项,一个都不留。

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

150. 逆波兰表达式求值

class Solution {
    public int evalRPN(String[] tokens) {
        // 遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
        // 注意 - 和/ 需要特殊处理,因为减法和除法的两个数顺序会影响结果
        // 但总的来说可以总结为: 后出栈的数 操作符 先出栈的数
        Deque<Integer> stack = new LinkedList<>();
        for(String s : tokens){
            if(s.equals("+")){
                stack.push(stack.pop() + stack.pop());
            }
            else if(s.equals("-")){
                stack.push(-stack.pop() + stack.pop());
            }
            else if(s.equals("*")){
                stack.push(stack.pop() * stack.pop());
            }
            else if(s.equals("/")){
                int temp1 = stack.pop();
                int temp2 = stack.pop();
                stack.push(temp2 / temp1);
            }
            else{
                stack.push(Integer.valueOf(s));
            }
        }

        return stack.pop();
    }
}