棧的應用之判斷括號匹配


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章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM