| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1275 人关注过本帖
标题:新人《c语言括号配对问题》 答案正确 当过oj总是runtime error
只看楼主 加入收藏
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:2 
新人《c语言括号配对问题》 答案正确 当过oj总是runtime error
括号配对问题
时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes



源代码:

#include<stdio.h>
int main()
{
    int count,i,j,n,sum1,sum2;
    char a[10][1000];
    scanf("%d",&count);
    for(i=0;i<=count;i++)
    {
        j=0;
        while((a[i][j]=getchar())!='\n')
            j++;
        a[i][j]='\0';
    }
    for(i=1;i<=count;i++)
    {    j=n=sum1=sum2=0;
        while(a[i][j]!='\0')
        {
            if(((a[i][j]=='(')&&(a[i][j+1]==']'))||((a[i][j]=='[')&&(a[i][j+1]==')')))
            {
                n=1;
                break;
            }
            else if(a[i][j]=='(')
                sum1++;
            else if(a[i][j]==')')
                sum1--;
            else if(a[i][j]=='[')
                sum2++;
            else if(a[i][j]==']')
                sum2--;
            j++;
        }
        if((sum1==0)&&(sum2==0)&&(n==0))
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
搜索更多相关主题的帖子: 配对 字符串 
2013-02-10 23:26
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
这是南洋理工的题吧,winfieldcw就是你吧?

首先你的数组开的就不够,第二你的判断逻辑也完全不对。这是典型的栈使用练习。

送两段代码,第一段是利用自建栈实现,第二段是程序栈通过递归实现。第一段效率更高,占用空间更少。第二段只是换一种方式而已,算法本质是相同。

程序代码:
#include<stdio.h>
#define LEN    10000
int main()
{
    char s[LEN], a[LEN];
    int t, p, i;
    for(scanf("%d", &t); t--; puts(p ? "No" : "Yes"))
    for(scanf("%s", &s), p = i = 0; p >= 0 && s[i]; i++)
    switch(s[i])
    {
        case '[':    a[p++] = '['; break;
        case '(':    a[p++] = '('; break;
        case ']':    if(p > 0 && a[p - 1] == '[') p--; else p = -1; break;
        case ')':    if(p > 0 && a[p - 1] == '(') p--; else p = -1; break;
    }
    return 0;
}

程序代码:
#include<stdio.h>
int isRight(int a)
{
    int b;
    while((b = getchar()) != '\n')
    {
        if(b == ')') if(a == '(') return 1; else{ while(getchar() != '\n'); return 0;}
        if(b == ']') if(a == '[') return 1; else{ while(getchar() != '\n'); return 0;}
        if(!isRight(b)) return 0;
    }
    if(a == '\n') return 1; else return 0;
}
int main()
{
    int n;
    for(scanf("%d\n", &n); n--; puts(isRight('\n') ? "Yes" : "No"));
    return 0;
}

重剑无锋,大巧不工
2013-02-11 00:20
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
ls  蟹蟹   数组开大了一点 还有加了判断sum1或者sum2是否小于0  就可以通过了   会不会是提交到一定数量   于心不忍就过了   呵呵
2013-02-11 10:58
快速回复:新人《c语言括号配对问题》 答案正确 当过oj总是runtime error
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017294 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved