假设表达式中包含两种括号:圆括号和方括号,其嵌套顺序随意,即([]())或[([])]等为正确的格式,[()]或([()]或(())均为不正确的格式。检验括号是否匹配可以用堆栈来实现当遇到 ( 或[ 时进栈,遇到 ] 或 ] 时出栈进行匹配检验,如果出现不匹配的情况立即束,否则继续取下一个字符。如果没有遇到不匹配的情况,最后判断栈是否为空,栈为空,括号匹配,否则不匹配。
源代码:
#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();
}
4267

被折叠的 条评论
为什么被折叠?



