判斷字符串中括號是否成對存在
比如:
()()(()) OK
()[]{}{([])} OK
((())] NO
思路:遇到左括號入棧,遇到右括號,將左括號出棧(對應的右括號要存在)
import java.util.HashMap; import java.util.Map; import java.util.Stack; public class BracketMatching { // pair以右括號為key, 左括號為值 private Map<Character, Character> pair = null; public BracketMatching() { pair = new HashMap<Character, Character>(); pair.put(')', '('); pair.put('}', '{'); pair.put(']', '['); } public boolean isMatch(String s) { Stack<Character> sc = new Stack<Character>(); for (int i = 0; i < s.length(); i++) { Character ch = s.charAt(i); if (pair.containsValue(ch))// 如果是左括號,放入棧中 { sc.push(ch); } else if (pair.containsKey(ch)) // 如果是右括號 { if (sc.empty()) // 棧為空,棧頭沒有字符與右括號匹配 { return false; } // 棧不為空,棧頭字符與右括號匹配 if (sc.peek() == pair.get(ch)) { sc.pop(); } else //網上許多列子沒有這里的else代碼塊,導致({}[]]])會被判斷為true { // 棧不為空,棧頭字符不與右括號匹配 return false; } } } return sc.empty() ? true : false; } public static void main(String[] args) { BracketMatching judger = new BracketMatching(); System.out.println(judger.isMatch("(***)-[{-------}]")); //true System.out.println(judger.isMatch("(2+4)*a[5]")); //true System.out.println(judger.isMatch("({}[]]])")); //false System.out.println(judger.isMatch("())))")); //false System.out.println(judger.isMatch("((()")); //false System.out.println(judger.isMatch("(){[[]]}")); //true } }