棧的應用之括號匹配的檢驗


棧的實際應用很多,其中括號匹配是很常見的例子。下面列出基本算法和源代碼,標明注釋以便日后復習和翻閱。

Description:

利用棧編寫滿足下列要求的括號匹配檢驗程序:假設表達式中允許包含兩種括號:圓括號和方括號,其嵌套的

順序隨意,即([]())或[([][])]等為正確的格式,[(]或([())或(()])均為不正確的格式。輸入一個包含上

述括號的表達式,檢驗括號是否配對。本題給出部分check()函數,要求將check()函數補充完整,並完成

整個程序。

算法:

    

 

代碼:

 1 void check()
 2  { // 對於輸入的任意一個字符串,檢驗括號是否配對
 3    SqStack s;
 4    SElemType ch[80],*p,e;
 5    if(InitStack(s)) // 初始化棧成功
 6    {
 7      scanf("%s",ch);
 8      p=ch;
 9      while(*p) // 沒到串尾
10        switch(*p)
11   {
12      case '(':
13      case '[':Push(s,*p);
14                 p++;
15                   break; // 左括號入棧,且p++,讀下一個字符
16      case ')':
17      case ']':if(!StackEmpty(s)) // 棧不空,如果為空的話返回0;!0=1
18                   {
19                    Pop(s,e); // 彈出棧頂元素
20                     if(*p==')'&&e!='('||*p==']'&&e!='[')
21                                                 // 彈出的棧頂元素與*p不配對
22 {
23                       printf("isn't matched pairs\n");
24                       exit(ERROR);
25                     }
26                     else
27                     {
28                       p++;//讀取下一個字符
29                       break; // 跳出switch語句
30                     }
31                   }
32                   else // 棧空
33                   {
34                     printf("lack of left parenthesis\n");
35                     exit(ERROR);
36                   }
37          default: p++; // 其它字符不處理,指針向后移
38        }
39      if(StackEmpty(s)) // 字符串結束時棧空
40        printf("matching\n");
41      else
42        printf("lack of right parenthesis\n");
43    }
44  }

 


免責聲明!

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



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