:括号匹配(C)

总时间限制:

1000ms

内存限制:

1000kB

描述

假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.

输入一串括号
如果输入的右括号多余,输出:Extra right brackets
如果输入的左括号多余, 输出:Extra left brackets
如果输入的括号不匹配,输出:Brackets not match
如果输入的括号匹配,输出:Brackets match

输入

{{{{)))

输出

Brackets not match

样例输入

{([)]}

样例输出

Brackets not match

提示

利用栈结构

 

 

#include"stdio.h"
#include"stdlib.h"
#define false -1
#define true 1
#define STAC 100
#define STA 10
typedef char Elemtype;
typedef struct {
    Elemtype *base;
    Elemtype *top;
    int stacksize;
}tack;
int InitStack(tack *S) {//构建一个空栈
    S->base = (Elemtype *)malloc(STAC * sizeof(Elemtype));
    if (!S->base)      return false;
    S->stacksize = STAC;//分配空间大小
    S->top = S->base;
    return true;
}
int Push(tack *S, Elemtype e) {//插入到栈顶
                               //判D断是否溢出
    if (S->top - S->base >= S->stacksize) {
        S->base = (Elemtype *)realloc(S->base, (S->stacksize + STA) * sizeof(Elemtype));
        if (!S->base)           return false;
        S->top = S->base + S->stacksize;
        S->stacksize += STA;
    }
    S->top++;
    *S->top = e;
    return true;
}

int main() {
    int i, n;
    char e;
    tack la;
    InitStack(&la);
    for (i = 0;; i++) {
        scanf("%c", &e);
        if (e == '\n')break;
        Push(&la, e);
        while (*(la.top - 1) == *la.top - 1 || *(la.top - 1) == *la.top - 2)
            la.top = la.top - 2;
    }
    if (la.base == la.top) printf("Brackets match\n");
    else if (*la.top == '(' || *la.top == '{' || *la.top == '[') {
        while (la.base != la.top) {
            la.top--;
            if (*la.top == ')' || *la.top == '}' || *la.top == ']') {
                printf("Brackets not match\n");
                
                return 0;
            }
        }
        printf("Extra left brackets");
    }
    else if (*la.top == ')' || *la.top == '}' || *la.top == ']') {
        while (la.base != la.top) {
            la.top--;
            if (*la.top == '(' || *la.top == '{' || *la.top == '[') {
                printf("Brackets not match\n");
                
                    return 0;
            }
        }
        printf("Extra right brackets\n");
    }
    
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值