吉林大学2022中国大学MOOC期末试题主观题特定规则括号匹配

特定规则的括号匹配(20分)

问题描述:

`{}`、`[]`、`()`又称大括号、中括号和小括号;括号匹配除了必要的同类型括号左右成对儿且不交叉的规定;还增加如下规则:大括号内能包含大、中、小括号,中括号内只能包含中、小括号,小括号内只能包含小括号。请编写程序判断从键盘输入的以`#`结束的字符串(可能包含空格、回车、换行和制表等符号,字符串长度不限),其中的`{}`、`[]`、`()`是否按照上述规则匹配。如果匹配成功,则输出提示信息`MATCHED`和匹配的括号对的数目;如果匹配不成功,则输出提示信息`ERR`,以及在出现第一个错误前、已经匹配的括号对的数目(提示信息和括号对数目的中间,以一个西文空格间隔)。匹配括号对的数目不超过int型可表示范围,且括号嵌套层数不超过100层。

输入:以`#`结束的任意长度字符串;其中匹配括号对的数目不超过int型可表示范围,且括号嵌套层数不超过100层。

输出:如果按上述规则大、中、小括号匹配成功,则输出提示信息`MATCHED`和匹配的括号对的数目;如果匹配不成功,则输出提示信息`ERR`,以及在出现第一个错误前,已经匹配的括号对的数目(提示信息和括号对数目的中间,以一个西文空格间隔),除此之外无其它字符。

样例1:

输入programming#

输出 MATCHED 0

样例2:

输入 o{n[lin(e j)udgem]e}{[[()]]}nt#

输出 MATCHED 7

样例3:

输入 {}[[[()]({})]]#

输出 ERR 3

样例3的括号匹配错误出现在最后一个`(`,此前已经匹配成功的括号有3对:{}[()]。

时间限制:500ms内存限制:32000kb

#include<stdio.h>
char c, s[100100];
int top=0, ans;
int main()
{
    int count = 0;
    ans = 1;
    while (1) {
        scanf("%c", &c);
        if (c == '#') break;
        if (c == '(' || c == '[' || c == '{') {

            s[++top] = c;        
            if (top != 1) {
                if (c == '{') {
                    if (s[top - 1] != '{') {
                        ans = 0;
                        break;
                    }
                }
                if(c == '[') {
                    if (s[top - 1] == '(') {
                        ans = 0;
                        break;
                    }
                }
            }
        }
        if (c == ')') {
            if (top && s[top] == '(') {
                top--;
                count++;
            }
            else {
                ans = 0;
                break;
            }
        }
        if (c == ']') {
            if (top && s[top] == '[') {
                top--;
                count++;
            }
            else {
                ans = 0;
                break;
            }
        }
        if (c == '}') {
            if (top && s[top] == '{') {
                top--;
                count++;
            }
            else {
                ans = 0;
                break;
            }
        }
    }
    if (ans==1) {
        printf("MATCHED");
        printf(" %d", count);
    }
    else {
        printf("ERR");
        printf(" %d", count);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值