題目:
17、括號匹配的檢驗(限2人完成)
通過鍵盤輸入一個表達式,其中包含圓括號和方括號(如:()[]),圓括號和方括號時成對出現,其中可以出現嵌套。嵌套形式如([]())或者[([][])]均為正確的格式,而[()或者([()]或者(()]均為錯誤格式。對輸入的表達式,進行括號匹配的檢查,如果匹配成功,返回1,匹配不成功,返回0。
具體實現:參考課本P76案例3.2。
代碼:
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef char SElemType; #define OK 0 #define ERROR 1 #define OVERFLOW -2 typedef int Status; typedef struct { SElemType *base; SElemType *top; Status stacksize; }SqStack; Status InitStack(SqStack* S) { S->base =(char*)malloc(sizeof(SElemType) * MAXSIZE); if( !S->base ) return OVERFLOW; S->top = S->base; S->stacksize = MAXSIZE; return OK; } Status StackLength( SqStack S ) { return S.top - S.base; } Status Push( SqStack* S, SElemType e) { if( S->top - S->base== S->stacksize ) return ERROR; *S->top++=e; return OK; } SElemType Pop( SqStack* S, SElemType e) { if( S->top == S->base ) { return 'w'; } e=*--S->top; return e; } Status DestroyStack( SqStack* S ) { if( S->base ) { free(S->base); S->stacksize = 0; S->base = S->top = NULL; } return OK; } Status isLeft(char c) { Status ret = 0; switch(c) { case '(': case '[': case '<': case '{': case '\'': case '\"': ret = 1; break; default: ret = 0; break; } return ret; } Status isRight(char c) { Status ret = 0; switch(c) { case ')': case ']': case '>': case '}': case '\'': case '\"': ret = 1; break; default: ret = 0; break; } return ret; } Status match(char left, char right) { Status ret = 0; switch(left) { case '(': ret = (right == ')'); break; case '[': ret = (right == ']'); break; case '<': ret = (right == '>'); break; case '{': ret = (right == '}'); break; case '\'': ret = (right == '\''); break; case '\"': ret = (right == '\"'); break; default: ret = 0; break; } return ret; } Status judge(const char* code) { SqStack stack; InitStack(&stack); Status ret=0; Status i=0; while( code[i] != '\0') { if(isLeft(code[i])) { Push(&stack,code[i]); } else if(isRight(code[i])) { char c = Pop(&stack,*(stack.top)); if(c=='w' || !match(c,code[i])) { printf("%c 匹配失敗!\n",code[i]); break; } } i++; } if((StackLength(stack)==0)&&(code[i]=='\0')) { printf("成功!\n"); ret = 1; } else if((StackLength(stack)!=0)) { printf("左括號有多余,匹配失敗\n"); ret = 0; } DestroyStack(&stack); return ret; } void main() { char* str = (char*)malloc(sizeof(char)*MAXSIZE) ; scanf("%s",str); judge(str); free(str); }