在南陽理工ACM看到的一道題
問題描述:問題描述 : 輸入一個字符串 裏面只含有 [ , ] , ( , ) 四種括號 ; 現要求判斷這個字符串 是否滿足括號匹配
如 ([])() 是匹配的 ([)]是不匹配的
先貼代碼
public void check(String str) {
Stack<Character> stack = new Stack<Character>();
// 如果該String長度爲奇數,不匹配
if (str.length() % 2 == 1) {
System.out.println("No");
} else {
stack = new Stack<Character>();
for (int i = 0; i < str.length(); i++) {
if (stack.isEmpty()) {
stack.push(str.charAt(i)); // 當前棧是空的 存入當前位置的字符
} else if ((stack.peek() == '[' && str.charAt(i) == ']')
|| (stack.peek() == '(' && str.charAt(i) == ')')) {
stack.pop(); // 滿足上面的條件 表示相鄰的兩個字符是一對匹配的括號 進行出棧操作
} else {
stack.push(str.charAt(i));
}
}
if (stack.isEmpty()) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
先說Stack - 棧 特點是後進先出 其中 push() 將一個對象寫入棧頂
peek() 方法返回棧頂對象且不將其出棧
pop() 返回棧頂對象並將其出棧
算法描述 : 先判斷字符串長度 爲奇數一定不匹配 方法結束
爲偶數用for循環遍歷字符串每個字符 棧爲空將當前字符入棧 做下一次循環
棧不爲空做比較 如果當前棧頂和當前位置字符是匹配的一對括號 pop方法出棧 不匹配當前字符就入棧
循環結束棧爲空 表示滿足括號匹配
出棧的過程就是一次匹配的過程如果最後棧不爲空 表示一定有括號沒匹配