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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java - 使用附加的“&”字符检查匹配的括号相关的知识,希望对你有一定的参考价值。

我写了一个函数来检查括号是否平衡,即{([])} 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;
}
答案

当你看到一个&,并且堆叠的顶部是&,然后弹出它,否则推动&

为了让你的代码处理它,而不是专门处理&,只需交换代码来检查stack之前的map

您的代码的其他问题:

  • Stack类是一个遗留类,建立在同步的Vector类之上。正如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 - 使用附加的“&”字符检查匹配的括号的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题Java实现括号匹配真题+解题思路+代码(2022&2023)

栈应用之 括号匹配问题(Python 版)

php 三元内联类检查 - 检查请求是否与特定字符串匹配,然后附加一个类(如果有)。

如何使用栈来实现括号匹配

对如下字符串(234453)[234]{2324}分析它的括号使用是否正确,括号匹配(Java实现)

用栈实现括号匹配的检验