假设表达式中包含两种括号:圆括号和方括号,其嵌套顺序随意,即([]())或[([])]等为正确的格式,[()]或([()]或(())均为不正确的格式。检验括号是否匹配可以用堆栈来实现当遇到 ( 或[ 时进栈,遇到 ] 或 ] 时出栈进行匹配检验,如果出现不匹配的情况立即束,否则继续取下一个字符。如果没有遇到不匹配的情况,最后判断栈是否为空,栈为空,括号匹配,否则不匹配。
源代码:
#define STACKINCREAMENT 10 #define STACK_INIT_SIZE 100 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int status ; typedef char SElemtype; #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<conio.h> 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]!='\0') { 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(" Parenthesis is match!\n"); else printf(" Parenthesis isn't match!\n"); return OK; } void main() { char str[100],enter; sqstack s; Init(&s); printf("input string chars:"); scanf("%s",str); scanf("%c",&enter); Parenthesis_match(&s,str); getch(); }