括号匹配问题

#include "stdio.h"
#include "malloc.h"

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

typedef struct{
    char *base;
    char *top;
    int stacksize;
}sqStack;

int initStack(sqStack *s)
{
    /*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
    s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
    if(!s->base) return 0;                /*分配空间失败*/
    s->top = s->base;                    /*最开始,栈顶就是栈底*/
    s->stacksize = STACK_INIT_SIZE;        /*最大容量为STACK_INIT_SIZE */
    return 1;
}

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) return 0;            /*存储分配失败*/
    s->top = s->base + s->stacksize;
    s->stacksize = s->stacksize + STACKINCREMENT;        /*设置栈的最大容量*/
    }
    *(s->top) = e;            /*放入数据*/
    s->top++;
    return 1;
}

int Pop(sqStack *s , char *e){
    if(s->top == s->base) return 0;
    *e = *--(s->top); 
    return 1;
}

int match(char e,char c){        /*比较栈顶元素e和输入的括号字符c是否匹配*/
    if(e=='(' && c==')')return 1;
    if(e=='[' && c==']')return 1;
    return 0;
}


void MatchBracket()
{
    sqStack s;
    char c , e ;
    initStack( &s );            /*初始化一个空栈*/
    scanf("%c",&c);            /*输入第一个字符*/
    while(c!='#'){            /*'#'为输入的结束标志*/
        if(s.top == s.base)
            Push(&s,c);    /*如果栈为空,则说明输入的是第一个字符,因此保存在栈中*/
        else
        {
             Pop(&s,&e);        /*取出栈顶元素*/
             if(match(e,c)!= 1){/*将输入的元素与取出的栈顶进行比较,如果匹配不成功*/
                Push(&s,e);    /*先将原栈顶元素重新入栈*/
                Push(&s,c);    /*再将输入的括号字符入栈*/
               }
        }
        scanf("%c",&c);  /*输入下一个字符*/
        }
    if(s.top == s.base)  printf("The brackets are matched\n");    /*如果栈s为空,则括号完全匹配*/
    else  printf("The brackets are not matched\n");        /*如果栈s不为空,则括号不完全匹配*/

}

main()
{
    printf("Please input some brackets for determing whether match\n");
    MatchBracket();
    getchar();
    getchar();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值