C语言括号匹配问题

#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!='{')
                    {
                        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); 返回空
//}


你可能感兴趣的:(括号匹配,程序格式)