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括号是否匹配了。