資料結構應用-----------括號匹配的檢驗
阿新 • • 發佈:2019-02-05
/*---------------------------------------------------------------------------------- 括號匹配程式 程式說明: 括號匹配的檢驗。 假設表示式中允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,即([]())或[([][])] 等為正確的格式,[(])或([())或(()]均為不正確的格式。檢驗括號是否匹配的方法可用“期待 的急切程式”這個概念來描述。例如考慮下列括號序列: [ ( [ ] [ ] ) ] 1 2 3 4 5 6 7 8 當計算機接受了第一個括號後,它期待著與其匹配的第八個括號的出現,然而等來的動量第二個 括號,此時第一個括號“[”只能暫時靠邊,而迫切等待與第二個括號相匹配的、第七個括號“)" 的出現,類似地,因等來的是第三個括號“[”,其期待匹配的程式較第二個括號更急迫,則第 二個括號也只能靠邊,讓位於第三個括號,顯然第二個括號的期待急迫性高於第一個括號;在接 受了第四個括號之後,第三個括號的期待得到滿足,消解之後,第二個括號的期待匹配就成為當 前最急迫的任務了,。。。。,依次類推。 這一個程式也是資料結構這一本書上的例子,但是它沒有提供程式碼,只有提供思想,所以我也將它 實現了。。不過,這一個程式也比較好玩. ------Seed --------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------- useSqStack.c 功能:提供測試程式碼 edited by Seed , 2011 -------------------------------------------------------------------*/ #include<stdio.h> #include"match.h" int main(void) { printf("歡迎使用括號匹配程式: \n") ; BranketMatch() ; printf("Bye") ; return 0 ; } /*----------------------------------------------------- match.h 功能:提供函式宣告、以及型別定義 ---------------------------------------------------*/ #ifndef MATCH_H_ #define MATCH_H_ typedef int Status ; typedef char SElemType ; #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 #define STACK_ININ_SIZE 100 #define STACKINCREMENT 10 #define CMP(ch) (ch != ']' && ch != ')') #define SUCCESS(ch,e) (('(' == e && ')' == ch) || ('[' == e && ch == ']')) #define ELSE(ch) (ch != ']' && ch != ')' && ch !='[' && ch !='(' ) typedef struct { SElemType *base ; SElemType *top ; int stacksize ; } SqStack ; Status DestoryStack(SqStack *S) ; Status ClearStack(SqStack *S) ; Status Push(SqStack *S,SElemType e) ; Status Pop(SqStack *S,SElemType *e) ; Status GetTop(SqStack S,SElemType *e) ; Status StackEmpty(SqStack S) ; int cmp(SqStack *S,SElemType ch) ; Status InitStack(SqStack *S) ; void BranketMatch() ; void PrintStack(SqStack *S) ; #endif /*------------------------------------------------------- SqStack.c 功能:提供方法實現 -----------------------------------------------------*/ #include<stdio.h> #include<string.h> #include"match.h" #include<stdlib.h> Status DestoryStack(SqStack *S) { free(S->base ) ; S->base = S->top = NULL ; return OK ; }//DestoryStack Status ClearStack(SqStack *S) { S->top = S->base ; return OK ; }//ClearStack Status Push(SqStack *S,SElemType e) { if(S->top -S->base >= S->stacksize ) { S->base = (SElemType *)realloc(S->base ,(S->stacksize +STACKINCREMENT) * sizeof(SElemType)) ; if(NULL == S->base ) { puts("ERROR") ; exit(OVERFLOW) ; } S->top = S->base + S->stacksize ; S->stacksize += STACKINCREMENT ; } *(S->top )++ = e ; return OK ; }//Push Status Pop(SqStack *S, SElemType *e) { if(S->top == S->base ) return ERROR ; *e = * --S->top ; return OK ; }//Pop Status GetTop(SqStack S,SElemType *e) { if(S.top == S.base ) return ERROR ; *e = *(S.top - 1 ); return OK ; }//GetTop Status StackEmpty(SqStack S) { return (S.base == S.top ) ; }// StackEmpty #define CMP(ch) (ch != ']' && ch != ')') /// #define SUCCESS(ch,e) (('(' == e && ')' == ch) || ('[' == e && ch == ']')) #define ELSE(ch) (ch != ']' && ch != ')' && ch !='[' && ch !='(' ) int cmp(SqStack *S,SElemType ch) { SElemType e ; if(ELSE(ch)) { return -1 ; } else if(StackEmpty(*S) && CMP(ch)) { return TRUE ; } else { GetTop(*S,&e) ; if(SUCCESS(ch,e)) return FALSE ; else if(!SUCCESS(ch,e) && (ch == ']' || ch == ')')) return -1 ; } return TRUE ; }//cmp Status InitStack(SqStack *S) { S->base = (SElemType *) malloc(STACK_ININ_SIZE * sizeof(SElemType) ) ; if(NULL == S->base) { puts("ERROR") ; exit(OVERFLOW) ; } S->top = S->base ; S->stacksize = STACK_ININ_SIZE ; return OK ; }//InitStack void BranketMatch() { SqStack S ; SElemType ch ; InitStack(&S) ; printf("請輸入括號,如 '('、'('、'['、']' : ") ; while((ch = getchar()) != 'q') { switch(cmp(&S,ch)) { case 0 : Pop(&S,&ch) ; puts("匹配成功") ; break ; case 1 : Push(&S,ch) ; puts("匹配失敗,改變急切度") ; break ; default : puts("不合法的輸入.") ; break ; }//switch-case while(getchar() != '\n') continue ; PrintStack(&S) ; printf("\n\n請輸入括號,如 '('、'('、'['、']' : ") ; }//while ClearStack(&S) ; DestoryStack(&S) ; }//BranketMatch void PrintStack(SqStack *S) { SElemType *temp ; temp = S->base ; printf("現在棧的內容:\n") ; while(temp != S->top) { printf("%2c",*temp) ; temp++ ; } }//PrintStack