在做南阳理工网站上的 第二 括号配对问题
题目要求如下:
描述-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入
-
3 [(]) (]) ([[]()])
样例输出
-
No No Yes
一:先判断每行的输入的 括号 是否是偶数个,如果不是则说明不符合题目要求。
二:如果先输入是右括号则也不符合题目要求。
三:如果括号里又嵌套了别的括号,则嵌套的括号也应该是配对的,即左右括号相等。
我的代码如下:
#include<stdio.h>
int main()
{
int n;
char clx = '(';
char crx = ')';
char clz = '[';
char crz = ']';
while(1)
{
scanf("%d",&n);
//对输入的行数进行 判断
if(n>0 && n<=100)
break;
printf("你输入的行数不对,请重数输入:\n");
}
while(getchar() !='\n')
;
char a[n][1000];
char *p[n];
for(int i=0;i<n;i++)
{
p[i] = a[i];
}
for(int i=0;i<n;i++)
{
gets(p[i]);
}
for(int i=0;i<n;i++)
{
bool reflag = false;
int zlx = 0;
int zrx = 0;
int zlz = 0;
int zrz = 0;
for(int j=0;j<10000;j++)
{
int lx = 0;
int rx = 0;
int lz = 0;
int rz = 0;
int *plflag = NULL;
int *prflag = NULL;
if(a[i][j] != '\0')
{
if((zlx < zrx) || (zlz < zrz))
break;
if(a[i][j] == clx)
{
lx++;
zlx++;
plflag = &lx;
prflag = ℞
}
if(a[i][j] == crx)
{
zrx++;
continue;
}
if(a[i][j] == clz)
{
lz++;
zlz++;
plflag = &lz;
prflag = &rz;
}
if(a[i][j] == crz)
{
zrz++;
continue;
}
for(int x=j+1;x<10000-j;x++)
{
reflag = false;
if(a[i][x] != '\0')
{
if(clx == a[i][x] )
{
lx++;
// continue;
}
if(crx == a[i][x] )
{
rx++;
// continue;
}
if(clz == a[i][x] )
{
lz++;
// continue;
}
if(crz == a[i][x] )
{
rz++;
}
if((*plflag == *prflag) && (lx == rx) && (lz == rz))
{
reflag = true;
break;
}
}else
break;
}
}else
break;
}
if(reflag && (zlx == zrx) && (zlz == zrz))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
而运行的结果是这样,但是我一直没有没找找一错误的地方......
答案错误:
输出结果不对,看看是不是忘了输出必要的换行或者大小写错误?如果不是,那很可能你的程序逻辑有问题,或者有特殊的数据没有考虑。