Java括号是否匹配

1. 流程图

下面是判断Java括号是否匹配的流程图:

graph LR
A[开始] --> B{是否为空}
B -- 是 --> C[不匹配]
B -- 否 --> D[初始化栈]
D --> E{是否遍历完所有字符}
E -- 是 --> F{栈是否为空}
E -- 否 --> G{当前字符是否是左括号}
G -- 是 --> H[将字符入栈]
G -- 否 --> I{当前字符是否是右括号}
I -- 是 --> J{栈顶是否与当前括号匹配}
I -- 否 --> K[不匹配]
J -- 是 --> L[弹出栈顶元素]
J -- 否 --> K[不匹配]
F -- 是 --> M[匹配]
F -- 否 --> E

2. 代码实现

下面是用Java实现判断括号是否匹配的代码,主要通过栈来实现:

import java.util.Stack;

public class BracketMatching {
    public static boolean isBracketMatching(String str) {
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);

            if (ch == '(' || ch == '{' || ch == '[') {
                stack.push(ch);
            } else if (ch == ')' || ch == '}' || ch == ']') {
                if (stack.isEmpty()) {
                    return false;
                }

                char top = stack.pop();

                if ((ch == ')' && top != '(') || (ch == '}' && top != '{') || (ch == ']' && top != '[')) {
                    return false;
                }
            }
        }

        return stack.isEmpty();
    }

    public static void main(String[] args) {
        String str1 = "([])"; // 匹配
        String str2 = "((})"; // 不匹配

        System.out.println("括号匹配结果1: " + isBracketMatching(str1));
        System.out.println("括号匹配结果2: " + isBracketMatching(str2));
    }
}

代码解释:

  • 第5行:创建一个存储字符类型的栈。
  • 第7行:遍历输入的字符串。
  • 第9-13行:如果当前字符是左括号,则将其入栈。
  • 第15-24行:如果当前字符是右括号,先判断栈是否为空,如果为空则返回false;否则,弹出栈顶元素,判断栈顶元素与当前括号是否匹配,如果不匹配则返回false。
  • 第26行:遍历结束后,判断栈是否为空,如果为空则返回true,否则返回false。
  • 第28-34行:测试代码,分别传入匹配和不匹配的字符串进行测试。

3. 类图

下面是Java括号匹配的类图:

classDiagram
    class BracketMatching {
        +isBracketMatching(String str): boolean
        -main(String[] args): void
    }

4. 总结

通过上述的代码和流程图,我们可以很容易地判断Java括号是否匹配。首先,我们可以将原始字符串的每个字符依次遍历,并使用栈来存储左括号。当遇到右括号时,我们弹出栈顶元素并判断是否匹配。如果遍历完所有字符后,栈为空,则说明括号匹配。否则,括号不匹配。

这种方法的时间复杂度为O(n),其中n为字符串的长度。这是因为我们需要遍历一次字符串,并在遇到右括号时执行栈的压栈和弹栈操作。空间复杂度为O(n),其中n为字符串的长度。这是因为我们需要使用一个栈来存储左括号。

总之,理解了上述的流程图和代码实现,我们就可以很好地判断Java括号是否匹配了。