代码实现:
import java.util.Stack;
public class test13 {
public static void main(String[] args) {
String str1="{[[()}]";
System.out.println(isBracketMatching(str1));
String str2="{([])}";
System.out.println(isBracketMatching(str2));
}
public static boolean isBracketMatching(String brackets) {
Stack<Character> stack = new Stack<>();
for (char c : brackets.toCharArray()) {
//将左边的所有括号压入栈中
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
//如果将要入栈的括号为右边且此时栈空,那么则右边的括号一定有没有匹配上的
} else if (c == ')' || c == ']' || c == '}') {
if (stack.isEmpty()) {
return false;
}
//使用栈顶元素和右边要匹配的所有元素进行匹配
char top = stack.pop();
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
return false;
}
}
}
return stack.isEmpty();
}
}
注意这里的比较逻辑,每次是将栈外为匹配的第一个元素和当前的栈顶元素进行匹配,因此除了保证括号的数量和类型是一致的之外,还需要保证其顺序
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
例如:
//匹配结果为false
String str1="{([)]}";
//匹配结果为true
String str2="{([])}";