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