您的位置:首页 > 编程语言 > C语言/C++

C语言括号匹配问题

2016-01-15 00:00 525 查看
摘要: 括号匹配简单实用,尤其在编译器处理程序格式(括号是否匹配)问题上发挥突出作用。

#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include<malloc.h>
#define OVERFLOW 0
#define ERROR 0
#define OK 1
#define STACKSIZE 100
#define STACKINCREMENT 50
#define OVERFLOW 0
typedef struct
{
char *top;
char *base;
int stacksize;
}sqstack;

int initstack(sqstack *s)
{
s->base=(char*)malloc(STACKSIZE*sizeof(char));
if(!s->base){exit(OVERFLOW);}
s->top=s->base;//->表示的是内容
s->stacksize=STACKSIZE;
return OK;
}

int gettop(sqstack s,char *e)
{
if(s.top==s.base) return OK;
*e=*(s.top-1);//使用top或base用的是“.”,表示指针
return OK;

}
int push(sqstack *s,char e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(char*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char));
if(!s->base){exit(OVERFLOW);}//分配不成功,进入exit
s->stacksize+=STACKINCREMENT;
s->top=s->base+s->stacksize;
}
*s->top++=e;
return OK;
}

int pop(sqstack *s,char *e)
{
if(s->top==s->base) return ERROR;
*e=*--s->top;
return OK;
}
int stackdestory(sqstack *s)
{
free(s->base);
s->base=NULL;
return OK;
}

int stackempty(sqstack s)
{
if(s.base==s.top)//表示栈空
return OK;
else
return ERROR;
}
/*
转载请注明出处:去转盘网www.quzhuanpan.com
*/
int main(void)
{
int flag=1;
char e,ch;
sqstack s;
initstack(&s);
//方法,如果没有不匹配的情形,则一直输入,flag=1,打印匹配
//不批配分两种1:一开始就不配,flag=0,不打印
//2:之后有一次不匹配了
// 匹配的话待在栈中,否则出来,flag=0
do
{
scanf("%c",&ch);
switch(ch)
{
case'{':
case'[':
case'(':push(&s,ch);break;
case'}':if(stackempty(s)) flag=0;//如果栈空,那么肯定不匹配,因为被消
else if(pop(&s,&e)&&e!='{')
{
&nbs
7fe0
p;          flag=0;// 如果是“{”,则不删,否则删,删则肯定不匹配,flag=0
}
break;
case']':if(stackempty(s)) flag=0;
else if( pop(&s,&e)&&e!='[')
{
flag=0;
}
break;
case')':if(stackempty(s)) flag=0;
else if(pop(&s,&e)&&e!='(')
{
flag=0;
}
break;
}
}while(ch!='#'&&flag);
if(!stackempty(s)) flag=0;// 如果空,则定不匹配,则flag=0,注意空为真!
if(flag) printf("匹配");
else printf("不匹配");
stackdestory(&s);
return 0;
}
/*
转载请注明出处:去转盘网www.quzhuanpan.com
*/
//备注realloc的原型
//void*   mrealloc(void   *old_mem_ptr,int   new_size)
//{
//return   realloc(old_mem_ptr,new_size); 返回空
//}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息