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
我写了一个函数来检查括号是否平衡,即 {([])} 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 synchronizedVector
class. As the javadoc says, you should useDeque
代替。不要过度折叠你的陈述。将
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