
运行结果不对。并未按题目要求,题目要求输入正整数n,再输入n行字符串,一共需要输入n+1行。输出为连续n行。你的程序每输入一个字符串就输出一个结果。
而且用scanf("%s",s)也不对。例如遇到空格或制表符时,采用%s格式的话就会认为读取结束,而并不能读取整个字符串,导致判断结果有误。
提供本题程序如下:
#include <stdio.h>#include <string.h>
int main()
{
int i,j,n,m,b[10]
char a[10][50]
scanf("%d",&n)
for(i=0i<ni++)
b[i]=0
getchar()
for(i=0i<ni++)
{
gets(a[i])
m=strlen(a[i])
if(m>31)
{b[i]=1break}
else for(j=0j<mj++)
if((a[i][j]<'a'||a[i][j]>'z')&&(a[i][j]<'A'||a[i][j]>'Z')&&(a[i][j]<'0'||a[i][j]>'9')&&(a[i][j]!='_'))
{b[i]=1break}
}
for(i=0i<ni++)
b[i]?printf("\nno"):printf("\nyes")
return 0
}
运行示例:
runtime error是运行时出错,很可能是你程序设置的输入方式和系统给测试数据的方式不同导致。请把题目放上来,这样别人还能帮你看看你的程序是不是按照题目要求去做了,以及有没有逻辑上的错误。
用数组模拟栈来做,代码如下,看不懂的地方再Hi我吧,栈的原理可以百度百科里看。不用栈的方法就像windning说的那样。
#include <stdio.h>
#define MAXSIZE 1000
int Match(char *str)
int main()
{
int i, n
char str[MAXSIZE]
scanf("%d", &n)
for (i = 1i <= 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 <stdio.h>
#include <string.h>
#define MAXSIZE 1000
int Match(char str[])
int main()
{
int i, n
char str[MAXSIZE]
scanf("%d", &n)
for (i = 1i <= 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 = 0i <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 = ij <strlen(str)++j)
str[j] = str[j+2]
printf("第%d次删除后:%s\n", count, str)
++count
}
return strlen(str) ? 0 : 1 //如果字符串中还有无法消除的字符,表示括号匹配不成功
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)