题目:请编写程序判断一个包含“(”和“)”的括号序列是否匹配。如匹配则输出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
()”
运行错误,应该怎样修改呀?
