nihbf 2024-01-13 17:39 采纳率: 8.3%
浏览 26
已结题

7-2 括号匹配问题,求解答

题目:请编写程序判断一个包含“(”和“)”的括号序列是否匹配。如匹配则输出Match;如不匹配,计算出使该序列变为匹配序列所需添加的最少括号数目(只允许在该序列开始和结尾处添加括号),并输出经添加最少括号后得到的合法匹配序列。

输入格式:
输入为若干行,每行一个字符串,包含不超过10^5 个括号。输入行数不超过10行。

输出格式:
对于输入的每个括号序列输出1行或2行信息。若输入的括号序列匹配,则输出Match。若不匹配,则输出分为2行,第1行为一个整数,表示将该序列变为匹配序列所需添加的最少括号数目,第2行为一个字符串,表示经添加最少括号后得到的合法匹配序列。

输入样例:
(())()
)(
()))((

输出样例:
Match
2
()()
4
((()))(())

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void checkParentheses(char *sequence);

int main() {
    // 读取输入行数
    int n;
    scanf("%d", &n);

    // 忽略输入后的换行符
    getchar();

    // 逐行处理输入
    for (int i = 0; i < n; i++) {
        // 读取括号序列
        char sequence[100001];
        fgets(sequence, sizeof(sequence), stdin);
        sequence[strcspn(sequence, "\n")] = '\0'; // 移除字符串末尾的换行符

        // 调用函数检查括号匹配
        checkParentheses(sequence);
    }

    return 0;
}

// 函数定义
void checkParentheses(char *sequence) {
    int count = 0; // 用于计数不匹配的括号数
    int open = 0;  // 记录当前尚未匹配的左括号数

    int len = strlen(sequence);

    // 遍历括号序列
    for (int i = 0; i < len; i++) {
        if (sequence[i] == '(') {
            open++;
        } else if (sequence[i] == ')') {
            if (open > 0) {
                open--;
            } else {
                count++;
            }
        }
    }

    // 输出结果
    if (count == 0 && open == 0) {
        printf("Match\n");
    } else {
        int a = count + open;
        printf("%d\n",a);
        // 打印最少需要添加的左括号
        for (int i = 0; i < count; i++) {
            printf("(");
        }
        // 打印原始序列
        printf("%s", sequence);
        // 打印最少需要添加的右括号
        for (int i = 0; i < open; i++) {
            printf(")");
        }
        printf("\n");
    }
}

测试“)(”时,运行结果为“
1
()”
运行错误,应该怎样修改呀?

  • 写回答

3条回答 默认 最新

  • 关注

    你的输入是什么?你输入的时候是不是忘记输入n了?你的代码是先输入n,然后输入n个字符串。我用你代码 测试 )( 的时候输出是2啊,如下图:

    img

    但是,看你题目的描述,没有输入n,应该是用EOF来结束输入

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月13日