代码实现:
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="{([])}";