#include#include #define STACKINCREAMENT 10 #define STACK_INIT_SIZE 100 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int status; typedef char SElemtype; typedef struct { SElemtype *base; SElemtype *top; status stacksize; }sqstack; //初始化棧 status Init(sqstack *s) { s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype)); if(!s->base) exit(OVERFLOW); s->top = s->base; s->stacksize = STACK_INIT_SIZE ; return OK; } //獲取棧頂元素 status Gettop(sqstack *s, SElemtype e) { if(s->top == s->base) return ERROR; e = *(s->top-1); return OK; } //壓棧 status push(sqstack *s, SElemtype e) { if(s->top - s->base >= s->stacksize) { s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype)); if(!s->base) exit(OVERFLOW); s->top = s->base + s->stacksize; s->stacksize += STACKINCREAMENT; } *s->top++ = e; return OK; } //出棧 status pop(sqstack *s, SElemtype *e) { if(s->top == s->base) return ERROR; *e=*--s->top; return OK; } //判斷是否為空棧 status stackempty(sqstack *s) { if(s->top==s->base) return OK; return ERROR; } //清空棧 status clearstack(sqstack *s) { if(s->top == s->base) return ERROR; s->top = s->base; return OK; } //括號匹配算法 status Parenthesis_match(sqstack *s,char *str) { int i=0, flag=0; SElemtype e; while(str[i] != '') { switch(str[i]) { case '(': push(s,str[i]); break; case '[': push(s,str[i]); break; case ')': { pop(s,&e); if(e != '(') flag=1; } break; case ']': { pop(s,&e); if(e!='[') flag=1; } break; default: break; } if(flag) break; i++; } if(!flag && stackempty(s)) printf(括號匹配成功! ); else printf(括號匹配失敗! ); return OK; } int main() { char str[100], enter; sqstack s; Init(&s); printf(請輸入字符串: ); scanf(%s,str); scanf(%c,&enter); Parenthesis_match(&s,str); return 0; }