c语言 《 括号配对问题》 结果正确 通不过oj✀系统 显示runtime error

2025-02-24 09:09:56
推荐回答(3个)
回答1:

runtime error是运行时出错,很可能是你程序设置的输入方式和系统给测试数据的方式不同导致。
请把题目放上来,这样别人还能帮你看看你的程序是不是按照题目要求去做了,以及有没有逻辑上的错误。

用数组模拟栈来做,代码如下,看不懂的地方再Hi我吧,栈的原理可以百度百科里看。不用栈的方法就像windning说的那样。

#include
#define MAXSIZE 1000
int Match(char *str);
int main()
{
int i, n;
char str[MAXSIZE];

scanf("%d", &n);
for (i = 1; i <= n; ++i)
{
scanf("%s", str);
printf("%s\n", Match(str) ? "YES" : "NO");
}

return 0;
}

int Match(char *str)
{
int top;
char s[MAXSIZE];

top = 0;
while (s[top] = *str++)
{
if (s[top] == '(' || s[top] == '[')
++top;
else if (s[top] == ')' && top > 0 && s[top-1] == '(')
--top;
else if (s[top] == ']' && top > 0 && s[top-1] == '[')
--top;
else
return 0;
}

return top ? 0 : 1;
}

不用栈的作法:算法思想是,每次寻找一对匹配的括号(这一对匹配的括号位置是挨着的),并将这对匹配的括号从原字符串中删除。如果经过若干次“寻找”,“删除”操作后字符串的长度变成0,表示输入的字符串是匹配的,否则是不匹配的。
举个例子:比如说输入([[]()]),那匹配的过程就是,
1.找第一对匹配的括号,找到的是[],将[]删除后变成([()])
2.找第二对匹配的括号,找到(),将()删除后变成([])
3.找第三对匹配的括号,找到[],将[]删除后变成()
4.找第四对匹配的括号,找到(),将()删除后变成空串,表示匹配成功。
再举个例子:比如说输入([](),那匹配的过程就是,
1.找第一对匹配的括号,找到的是[],将[]删除后变成(()
2.找第二对匹配的括号,找到(),将()删除后变成(
3.找第三对匹配的括号,找不到匹配的括号,此时字符串里还有一个字符(,表示匹配不成功。
具体见代码,调试一下就明白了。

#include
#include
#define MAXSIZE 1000
int Match(char str[]);
int main()
{
int i, n;
char str[MAXSIZE];

scanf("%d", &n);
for (i = 1; i <= n; ++i)
{
scanf("%s", str);
printf("第%d次输入处理结果:\n", i);
printf("%s\n", Match(str) ? "Yes" : "No");
}

return 0;
}

int Match(char str[])
{
int i, j, len, flag, count;

flag = 1; //flag等于1表示当前可能还有未匹配的括号
count = 1; //记录是第几次删除,调试观察用
while (flag && strlen(str))
{
flag = 0; //假设当前字符串是匹配的
//每次for循环查找一对匹配的括号
for (i = 0; i < strlen(str); ++i)
if ((str[i] == '(' && str[i+1] == ')') || (str[i] == '[' && str[i+1] == ']'))
{
flag = 1; //flag等于1表示当前可能还有未匹配的括号
break;
}
//以下打印信息可以方便的看到程序运行的过程
printf("---------------\n");
printf("第%d次删除前:%s\n", count, str);
//该for循环用于将上面for循环里找到的一对匹配的括号从原字符串中删除
for (j = i; j < strlen(str); ++j)
str[j] = str[j+2];
printf("第%d次删除后:%s\n", count, str);
++count;
}

return strlen(str) ? 0 : 1; //如果字符串中还有无法消除的字符,表示括号匹配不成功
}

回答2:

LZ,oj可不是对着样例编程啊。。。括号匹配是用栈的思想数出来的,不是这样简单地判断啊。。
比如[()()()()()()()()()()]这样的你的程序都会轻易地跪掉啊。。。
简单来讲,对[]和()分别记一组计数器,初始为0,遇到左括号就+1,右括号就-1,在任意一次+-中,如果某个计数器为负,则输出NO并中断。
当一行判断结束,如果计数器不为0,则输出NO;如果为0,则这一行正确,输出YES。
然后再特殊判断一点:[后面不能是)且(后面不能是],我觉得应该就差不多了。

回答3:

运行是错误!!!结果正确?