Skip to content


20. 有效的括号

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

155. 最小栈

java
class MinStack {
    private Deque<Integer> stk1 = new ArrayDeque<>();
    private Deque<Integer> stk2 = new ArrayDeque<>();

    public MinStack() {

    }

    public void push(int val) {
        stk1.push(val);
        if (stk2.isEmpty() || val < stk2.peek()) {
            stk2.push(val);
        } else {
            stk2.push(stk2.peek());
        }
    }

    public void pop() {
        stk1.pop();
        stk2.pop();
    }

    public int top() {
        return stk1.peek();
    }

    public int getMin() {
        return stk2.peek();
    }
}

394. 字符串解码

java
// 有些麻烦,栈要入队出队,数字和字符分开存放
class Solution {
    public String decodeString(String s) {
        Deque<Integer> stkNumber = new ArrayDeque<>();
        Deque<Character> stkChar = new ArrayDeque<>();

        int num = 0;
        for (char ch : s.toCharArray()) {
            if (Character.isDigit(ch)) {
                num = num * 10 + ch - '0';
            } else if (ch == ']') {
                // 出栈
                StringBuilder ss = new StringBuilder();
                while (stkChar.peek() != '[') {
                    ss.append(stkChar.pop());
                }
                stkChar.pop();
                int number = stkNumber.pop();
                for (int i = 0; i < number; i++) {
                    for (int j = ss.length() - 1; j >= 0; j--) {
                        stkChar.push(ss.charAt(j));
                    }
                }
            } else {
                if (ch == '[') {
                    stkNumber.push(num);
                    num = 0;
                }
                stkChar.push(ch);
            }
        }
        char[] ans = new char[stkChar.size()];
        for (int i = ans.length - 1; i >= 0; i--) {
            ans[i] = stkChar.pop();
        }

        return new String(ans);
    }
}

739. 每日温度

java
// 从后往前,单调栈
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] ans = new int[temperatures.length];
        // 单调栈记录下标即可,可以获取温度和计算结果
        Deque<Integer> stack = new ArrayDeque<>();
        for (int i = temperatures.length - 1; i >= 0; i--) {
            while (!stack.isEmpty() && temperatures[i] >= temperatures[stack.peek()]) {
                stack.pop();
            }
            ans[i] = stack.isEmpty() ? 0 : stack.peek() - i;
            // 由于数组默认赋值为0,所以下面这句也行
            // if(!stack.isEmpty()) ans[i] = stack.peek() - i;
            stack.push(i);
        }
        return ans;
    }
}