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

标签 java hashmap stack matching parentheses

我编写了一个函数来检查括号是否平衡,即 {([])} 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类是一个遗留类,构建在同步 Vector 之上类(class)。正如 javadoc 所说,您应该使用 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

关于Java - 检查带有附加 '&' 字符的匹配括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52280797/

相关文章:

java - 获取 java.lang.NoSuchMethodError

java - 我还能做些什么来处理运行 Ant 的 "GC Overhead Limit Exceeded"(命令行)?

javascript - 在 javascript/jquery 中为 JSON 创建 hashmap

c - 了解在堆栈中执行 C 代码(Mac 黑客手册代码)

c++ - 使用单调堆栈背后的直觉

java - Eclipse 动态 Web 项目中缺少 WEB-INF 文件

java - Dom 解析器和 Xerces 解析器之间的区别

java - 在并行测试执行中使用 Hashmap 作为线程安全

Java:Enum子集元素的Hashmap

c++ - 如何使用递归反转打印堆栈?