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