Java - 检查带有附加“&”字符的匹配括号

Java - Checking matching parenthesis with additional '&' character

我写了一个函数来检查括号是否平衡,即 {([])} true,{(}) false。但我现在正试图弄清楚如何解释与自身匹配的额外字符“&”,即 &{&&}& true,&{&} false。我尝试只计算“&”的数量以查看它是否均匀,但这似乎不起作用。有什么想法吗?

public static boolean isBalanced(String input) {
    if (input == null || input.length() == 1) return false;
    int size = input.length();
    if (size % 2 == 1) return false;

    Stack<Character> stack = new Stack<Character>();
    HashMap<Character, Character> map = new HashMap<Character, 
    Character>();
    map.put('(', ')');
    map.put('[', ']');
    map.put('{', '}');

    for (int i = 0; i < size; i++){
        char temp = input.charAt(i);
        if (map.containsKey(temp)) stack.push(temp);
        else if (stack.isEmpty() || map.get(stack.pop()) != temp) 
        return false;
    }

    return true;
}

当看到一个&,并且栈顶是一个&,则弹出,否则压入&

为了让您的代码处理该问题,无需特别处理 &,只需交换代码以检查 map.

之前的 stack

您的代码的其他问题:

  • Stack class is a legacy class, built on top of the synchronized Vector class. As the javadoc says, you should use Deque代替。

  • 不要过度折叠你的陈述。将 if 控制的语句放在单独的行中,以提高人类的可读性。

  • 不要使用==(或!=)比较对象,使用equals().

  • 你忘了在循环后检查堆栈是否为空,以确保没有悬挂对。

public static boolean isBalanced(String input) {
    if (input == null)
        return false;
    int size = input.length();
    if (size % 2 == 1)
        return false;

    HashMap<Character, Character> map = new HashMap<>();
    map.put('(', ')');
    map.put('[', ']');
    map.put('{', '}');
    map.put('&', '&');

    Deque<Character> stack = new ArrayDeque<>();
    for (int i = 0; i < size; i++) {
        Character temp = input.charAt(i); // autobox here so it only happens once
        if (temp.equals(stack.peek())) // equals is false if stack is empty, since peek returns null
            stack.pop();
        else if (map.containsKey(temp))
            stack.push(map.get(temp));
        else
            return false;
    }

    return stack.isEmpty();
}

测试

System.out.println(isBalanced("{([])}"));
System.out.println(isBalanced("{(})"));
System.out.println(isBalanced("&{&&}&"));
System.out.println(isBalanced("&{&}"));
System.out.println(isBalanced("(("));

输出

true
false
true
false
false