1,括號匹配是指在某個字符串中,左括號出現的順序及個數與右括號保持一致。如:
{ [ ( ) ] } ----匹配 { [ ] } ----匹配 { ( } ) ---不匹配①
{ [ ( ) ] -----不匹配② { [ ] } ) ----不匹配③
不匹配一共有如上三種情況:①左右對應的括號不匹配,②右括號比左括號個數多,①右括號比左括號個數少
2,使用棧來判斷括號匹配的思路:
首先 new 一個棧的實例用來保存表達式中的左括號。
然后,根據 index 指針 依次掃描表達式各個字符,遇到左括號類的字符 char 則將之入棧,遇到右括號類的字符則將棧頂的左括號字符出棧並且與 char 進行比較,看是否匹配。比較功能由 isPaired(char left, char right)函數實現。
為什么 isBalanced 初始化成true 並將之放到for 循環中?
這樣,只要在括號比較中有不匹配的括號( isBalaced 會被設置成 false),for 循環就不再需要執行了,即不再需要判斷表達式中后面的括號是否匹配了。
3,括號匹配的JAVA代碼實現
判斷括號匹配時,需要一個棧來保存表達式中的左括號,順序棧 SequenceStack.java 的實現參考:
1 import list.SequenceStack; 2 3 public class BalanceChecker { 4 /* 5 * @Task:使用棧判斷表達式的括號匹配 6 * @param: expression 待檢查的字符串 7 * @return 若括號匹配則返回true 8 */ 9 public static boolean checkBalance(String expression){ 10 SequenceStack<Character> openDelimiterStack = new SequenceStack<Character>(); 11 int characterCount = expression.length(); 12 boolean isBalanced = true; 13 int index = 0;//標記是否已經到達表達式末尾 14 char nextCharacter = ' ';//標記表達式中下一個待判斷的字符 15 for(; isBalanced && (index < characterCount); index++){ 16 nextCharacter = expression.charAt(index); 17 switch(nextCharacter){//只對表達式中的括號進行處理,其他字符都不滿足switch中的case 18 case '(': case '[': case '{': 19 openDelimiterStack.push(nextCharacter);//只有表達式中的左括號才能入棧 20 break; 21 case ')': case ']': case '}': 22 if(openDelimiterStack.empty()) 23 isBalanced = false;//當碰到右括號時,此時表達式還未結束,但棧中已經沒有左括號了,說明右括號多於左括號 24 else{//棧中還有左括號 25 char openDelimiter = openDelimiterStack.pop(); 26 isBalanced = isPaired(openDelimiter, nextCharacter);//判斷此時棧中左括號與表達式字符右括號是否匹配 27 } 28 break; 29 default: break;//對於 非括號字符直接執行 break; 30 }//end switch 31 }//end for 32 33 //表達式中的右括號已經判斷完了,但還有左括號(棧未空),說明左括號個數多於右括號 34 if(!openDelimiterStack.empty()) 35 isBalanced = false; 36 return isBalanced; 37 } 38 //判斷左右括號是否匹配 39 private static boolean isPaired(char left, char right){ 40 return (left == '(' && right == ')') || 41 (left == '[' && right == ']') || 42 (left == '{' && right == '}'); 43 } 44 45 //for test purpose 46 public static void main(String[] args) { 47 String expression = "a {b [c (d + e)/2 - f] + 1}"; 48 boolean isBalanced = checkBalance(expression); 49 if(isBalanced) 50 System.out.println(expression + " is Balanced!"); 51 else 52 System.out.println(expression + " is not Balanced!"); 53 } 54 }
算法詳細解釋參考《數據結構與算法JAVA語言描述第二版》--Frank M.Carrano 著.第21章