NYOJ 括号配对问题(不用栈)

来源:互联网 发布:卫星电视网络在线直播 编辑:程序博客网 时间:2024/05/22 00:26
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3[(])(])([[]()])
样例输出
NoNoYes

看别人的答案都用栈,因为不会用,所以用一般的方法。代码很长

思考: ] 的前面 一定不是 ( 。!!!!

           )的前面一定不是  [  。!!!

           用 b 来统计 能配对的次数

          b*2  就是 配对的字符的总个数

           拿b*2 与字符串长度 l 比较!!!!

          当然,如果 长度是奇数,第一个字符是 ]  或 ) 一定是不行的的

#include<stdio.h>#include<string.h>int main(){int n,l,i,j;int a,b;char s[10020];scanf("%d",&n);getchar();while(n--){    a = 0;    b = 0;scanf("%s",s);l=strlen(s);if(l%2==1||s[0]==']'||s[0]==')'){printf("No\n");continue;}else{for(i=1;i<l;i++){if(s[i]==']'){if(s[i-1]=='('){printf("No\n");a =1;break;}}                else if(s[i]==')')                {                    if(s[i-1]=='[')                    {                        printf("No\n");                        a = 1;                        break;                    }                }if(s[i]==']'){for(j=i-1;j>=0;j--){if(s[j]=='['){s[i]=s[j]='0';                                b++;break;}else if(s[j]=='0'){continue;}}}else if(s[i]==')'){for(j=i-1;j>=0;j--){if(s[j]=='('){s[i]=s[j]='0';b++;break;}else if(s[j]=='0'){continue;}}}}if(b==l/2)                    printf("Yes\n");                else if(b!=l/2&&a!=1)                    printf("No\n");}}return 0;}

原创粉丝点击