Java 通过 pop 方法获取最后一个元素后出现堆栈错误

Java Stack error after getting last element via pop method

我有下面的代码来解决Hackerrank

public static void main(String[] args) {
        System.out.println(isBalanced("{(([])[])[]}"));
}

public static String isBalanced(String s) {
    Stack<Character> stack = new Stack<>();
    stack.push(s.charAt(0));

    for (int i = 1; i < s.length(); i++) {
        Character c = s.charAt(i);
        Character cStack = stack.peek();


        if (cStack == '{' && c == '}' 
            || cStack == '[' && c == ']' 
            || cStack == '(' && c == ')') {
            stack.pop();
        } else {
            stack.push(c);
        }
    }

    if (stack.isEmpty())
        return "YES";
    return "NO";
}

虽然代码似乎没有任何问题,但它在 Hackerrank 页面上抛出了以下错误。我已经在本地 IDE 中测试了输入,因为它是 {(([])[])[]},但我不确定是否需要获取最后一个元素(可能是因为通过 Character cStack = stack.peek(); 获取它然后stack.pop();.

那么,能否请您查看并测试 Hackerrank 页面上的这段代码,让我知道哪里出了问题?

更新:

public static String isBalanced(String s) {
    Stack<Character> stack = new Stack<>();
    stack.push(s.charAt(0));

    for (int i = 1; i < s.length(); i++) {
        Character c = s.charAt(i);

        if (c == '{' || c == '[' || c == '(') {
            stack.push(c);
        } else if (stack != null) {
            Character cStack = stack.peek();
            if (cStack == '{' && c == '}'
                    || cStack == '[' && c == ']'
                    || cStack == '(' && c == ')') {
                stack.pop();
            }
        }
    }
    if (stack.isEmpty())
        return "YES";
    return "NO";
}

在调用stack.peek()之前,需要检查栈是否为空。在空堆栈上调用 pop()peek() 将引发错误。
如果当前字符是左括号,您甚至不需要检查堆栈顶部。如果是右括号,则先检查堆栈是否为空。如果是,return 错误。否则比较最前面的字符再做决定。