括号匹配

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

 

源代码:

#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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值