利用 java.util.Stack 後進先出特性,高效解決括號匹配問題。題目要求判斷只含 ()[] 的字符串是否完全匹配。
( [ → 入棧) ] → 檢查棧頂:
- 棧空 → 不匹配
- 棧頂非對應左括號 → 不匹配
- 匹配 → 出棧package com.day1;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String[] arr = new String[n];
for (int i = 0; i < arr.length; i++) arr[i] = input.next();
for (String s : arr) System.out.println(isMatch(s));
}
private static String isMatch(String str) {
Stack stack = new Stack<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '(' || c == '[') {
stack.push(c); // 左括號入棧
} else { // 右括號
if (stack.empty() || !isBracketMatch(stack.peek(), c)) {
return "No"; // 棧空或不匹配
}
stack.pop(); // 匹配出棧
}
}
return stack.empty() ? "Yes" : "No"; // 最終檢查
}
private static boolean isBracketMatch(Character left, Character right) {
return (left == '(' && right == ')') || (left == '[' && right == ']');
}
}
| 輸入 | 輸出 | 說明 |
|---|---|---|
| No | 交叉嵌套不匹配 | |
| No | 類型不匹配 | |
| Yes | 完美嵌套匹配 | |
| No | 棧非空剩餘左括號 | |
| No | 棧空遇右括號 |
💡
Stack繼承Vector同步開銷大,推薦使用Deque<T> stack = new ArrayDeque<>()替代,提供push/pop/peek同樣語義,性能更優、非線程安全適用單線程場景。