假設表達式中只允許兩種括號:()、{};
正確表達順序為:()或{}或({})或{({}{})}的形勢;如{(}或(})或({)}的表達形勢均不對。
算法的設計思想:
出現左括弧則進棧;
出現右括弧則首先檢測棧是否為空,
若棧空則表明此右括弧多余,表達式不匹配。
否則和棧頂數據比較,若匹配則棧頂出棧。
否則表明表達式不匹配;
最后若棧空且沒有做魚右括弧則匹配正確,否則表明不匹配。
實現代碼如下(Stack.h頭文件為之前寫的數據結構-棧的順序結構中寫的數組那個方法,用到了里面棧的結構和連個基本棧操作)
1 void Matching(char e[]) 2 { 3 Stack S; 4 InitStack(S); 5 unsigned int i = 0, state = 1; 6 char z; 7 while((int)(i <= strlen(e)) && state && e[i] != '\0') //結束條件 超出數組長度或state為0或字符串結束 8 { 9 switch(e[i]) 10 { 11 case '(': 12 case '{': 13 Push(S,e[i]); //遇到({則進棧 14 i++; 15 break; 16 case ')': 17 GetTop(S,z); 18 if(!StackEmpty(S) && z == '(') //遇到)則判斷棧頂是不是(,是的話出棧,不是則不匹配 19 { 20 Pop(S,z); 21 i++; 22 } 23 else 24 state = 0; 25 break; 26 case '}': 27 GetTop(S,z); 28 if(!StackEmpty(S) && z == '{')//遇到}則判斷棧頂是不是{,是則出棧,不是則不匹配 29 { 30 Pop(S,z); 31 i++; 32 } 33 else 34 state = 0; 35 break; 36 } 37 } 38 if(StackEmpty(S) && state) //空棧且state不為0則全部匹配 39 printf("括號全部匹配"); 40 else 41 printf("括號不匹配"); 42 }
主函數測試代碼如下:
1 void main() 2 { 3 char e[20]; 4 printf("請輸入括號:"); 5 scanf("%s",e); 6 Matching(e); 7 }
測試只要輸入表達式格式正確,則匹配結果是正確的。
