棧的簡單應用-括號匹配
阿新 • • 發佈:2019-01-08
假設表示式中執行包含兩種括號:圓括號和方括號,其巢狀順序隨意,即
([]) 或 [([][])]等均為正確的格式。[(]) 或 ([()) 或 (())]均為不正確的格式。檢驗括號
匹配的方法可以用“期待的急迫程度”這個概念來描述
分析可能出現不匹配的情況:
(1)到來的右括弧不是所“期待”的;
(2)到來的是“不速之客”(右括弧多了);
(3)直到結束也沒有到來所“期待”的(左括弧多了)。
括號匹配的檢驗邏輯如下:
(1)凡是出現左括弧,則進棧。
(2)凡是出現右括弧,首先檢查棧是否為空;
若棧空,則表明“右括弧”多了;
否則和棧頂元素比較:
若相匹配,則“左括弧出棧”;
否則不匹配。
(3)表示式檢驗結束時:
若棧空,則匹配正確;
否則表明“左括弧”多了。
具體程式碼如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include "sqstack.h" //引入順序棧儲存結構及其基本操作 5 #define OK 1 6 #define ERROR 0 7 void check(){ 8 //對於輸入的任意一個字串判斷其括號是否匹配9 10 SqStack *s=(SqStack*)malloc(sizeof(SqStack)); 11 12 StackType str[100],*p=NULL,*e; 13 e = (StackType*)malloc(sizeof(StackType)); 14 if (InitStack(s) == OK) { 15 printf("請輸入表示式\n"); 16 gets(str); 17 p = str; 18 while (*p) //沒到串尾 19 switch(*p) 20 { 21 case'(': 22 case'[': 23 Push(s, *p++); break;//左括號入棧 且p++ 24 case')': 25 case']': 26 if (EmptyStack(s) != OK) 27 {//棧不為空 28 Pop(s, e); //彈出棧頂元素 29 if(*p==')'&&*e!='('||*p=='['&&*e!=']') 30 //彈出的棧頂元素與*p不匹配 31 { 32 printf("左右括號不匹配\n"); 33 return; 34 } 35 else 36 { 37 p++; 38 break; 39 } 40 41 42 } 43 else //棧空 44 { 45 printf("缺乏左括號\n"); 46 return; 47 } 48 default: p++;//其他字元不處理,指標後移 49 } 50 if (EmptyStack(s) == OK) //字串結束時棧空 51 printf("括號匹配\n"); 52 else 53 printf("缺乏右括號\n"); 54 55 56 57 58 } 59 60 61 62 63 } 64 65 int main() { 66 check(); 67 return 0; 68 69 }