數據結構-棧的實現之括號匹配檢測


假設表達式中只允許兩種括號:()、{};
正確表達順序為:()或{}或({})或{({}{})}的形勢;如{(}或(})或({)}的表達形勢均不對。
算法的設計思想:

  出現左括弧則進棧;

  出現右括弧則首先檢測棧是否為空,

    若棧空則表明此右括弧多余,表達式不匹配。

    否則和棧頂數據比較,若匹配則棧頂出棧。

      否則表明表達式不匹配;

  最后若棧空且沒有做魚右括弧則匹配正確,否則表明不匹配。

實現代碼如下(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 }

測試只要輸入表達式格式正確,則匹配結果是正確的。


免責聲明!

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



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