| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3339 人关注过本帖
标题:成对出现括号的问题
只看楼主 加入收藏
zhangx378
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2016-9-29
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:9 
成对出现括号的问题
问题是“合法的括号”,及括号要成对出现,且要按照正确的顺序,例如:{}[](),{[]}()就是合法的,([),([)]就不对。
下面是我的代码,不过只能判断相邻成对出现的,例如{}()[]等,请问该怎么改?
#include<stdio.h>
#include<string.h>
int main()
{
    char ch[1000];
    int i=0,a=0;//a用来判断括号是否成对出现,若整个字符串中都成对,输出True。
    scanf("%s",ch);
    for(i=0;i<strlen(ch);i+=2)
    {
        if(ch[i]=='{')
        {
            if(ch[i+1]!='}')
            {
                printf("False\n");
                a=1;               
                break;
            }
        }
        else if(ch[i]=='[')
        {
            if(ch[i+1]!=']')
            {
                printf("False\n");
                a=1;
                break;
            }
        }
        else if(ch[i]=='(')
        {
            if(ch[i+1]!=')')
            {
                printf("False\n");
                a=1;
                break;
            }
        }
    }
    if(a==0)
    {
        printf("True\n");
    }
    return 0;
 }
2016-10-30 13:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
用栈
每遇到右括号,栈顶必然应该有一个与之匹配的左括号,消除之
最终,栈应该是空的
2016-10-30 13:33
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:0 
你每次都拿两个字符来判断,然后跳过两字符,
假如第二个字符是另一种括号的左括符呢?因为不是当前括号的类型被跳过。
你这一跳两字符,岂不是都不给那个字符判断是不是其它类型括号左括符的机会。

2016-10-30 14:11
zhangx378
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2016-9-29
收藏
得分:0 
回复 3楼 bccn250
对啊,我已经意识到了,但不知道该怎么改。
2016-10-30 14:12
zhangx378
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2016-9-29
收藏
得分:0 
求各位解答。
2016-10-30 23:28
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:10 
for(i=0;i<strlen(ch);i+=2)//strlen(ch)这个运算不应该放在这里,每次循环一次都要计算字符串的长度啊
你每次都是比较相邻两个括号是否匹配。

使用栈(后进先出),
遇到一个左括号,入栈,遇到一个右括号,就和栈顶比较,相同就出栈,否则结束(不匹配)。循环直到串遍历完,且栈空。
2016-10-30 23:34
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
//试一下,看行不行
#include<stdio.h>
#include<string.h>

void main()
{
    char stack[100];
    char str[100];
    int len,i,top=-1,state=0;
    char ch;
    gets(str);
    len=strlen(str);
    for(i=0;i<len;i++){
        ch = str[i];
        switch(ch){
        case '(':
            stack[++top]=ch;
            break;
        case '{':
            stack[++top]=ch;
            break;
        case '[':
            stack[++top]=ch;
            break;
        case ')':
            if(top==-1 || stack[top]!='(')
                state=1;
            top--;
            break;
        case '}':
            if(top==-1 || stack[top]!='{')
                state=1;
            top--;
            break;
        case ']':
            if(top==-1 || stack[top]!='[')
                state=1;
            top--;
            break;
        }
        if(state==1){
            break;
        }
    }

    if(top==-1 && state==0){
        printf("OK\n");
    }else
        printf("NO\n");
}
2016-10-30 23:51
zhangx378
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2016-9-29
收藏
得分:0 
回复 7楼 word123
谢谢,可以运行,辛苦了,之前有大神提示用栈,主要是自己还没学到,再看了下很复杂,但您这么辛苦编程,我一定好好钻研,把这个搞清楚。
2016-10-31 00:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 8楼 zhangx378
程序代码:
#include <stdio.h>
#include <stdbool.h>

bool foo( const char* s )
{
    char stack[1000];
    size_t length = 0;
    for( const char* p=s; *p; ++p )
    {
        switch( *p )
        {
        case '(': stack[length++] = ')'; break;
        case '[': stack[length++] = ']'; break;
        case '{': stack[length++] = '}'; break;
        case ')': case ']': case '}':
            if( length!=0 && stack[length-1]==*p )
                --length;
            else
                return false;
        }
    }
    return length==0;
}

int main( void )
{
    char s[1000];
    scanf( "%s", s );
    printf( "%s\n", foo(s)?"True":"False" );

    return 0;
}

2016-10-31 09:17
zhangx378
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2016-9-29
收藏
得分:0 
回复 9楼 rjsp
谢谢,已经解决。
2016-10-31 22:09
快速回复:成对出现括号的问题
数据加载中...
 
   



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

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