黑马程序员技术交流社区

标题: 请教个c语言的题目。悬赏2个技术分 [打印本页]

作者: a_skting    时间: 2016-4-24 09:38
标题: 请教个c语言的题目。悬赏2个技术分
本帖最后由 a_skting 于 2016-4-24 21:16 编辑

要求用户输入一串圆括号或者大括号。然后给出判断他们是否正确的嵌套。

Enter parentheses and/or braces: {(){}{()}}
Parentheses/braces are nested properly.
思路大概是用到栈的原理,定一个指针或者数组下标都行,如果是左括号进行自加,如果碰上右括号则进行自减判断是否匹配。

作者: 叶子哥    时间: 2016-4-24 11:37
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[]) {
  3.    
  4. //    要求用户输入一串圆括号或者大括号。然后给出判断他们是否正确的嵌套。
  5.     //先定义4个字符用来表示"(){}"符号
  6.     char bj1 = '(';
  7.     char bj2 = ')';
  8.     char bj3 = '{';
  9.     char bj4 = '}';
  10.    
  11.     int flag = 1;  //作为判断的标记
  12.    
  13.     //定义一个字符数组用来接收用户输入的字符串
  14.     char ch[50];
  15.     printf("请输入一连串圆括号或大括号:\n");
  16.     scanf("%s",ch);
  17.     printf("您输入的是: %s\n",ch);
  18.     //计算输入的字符串长度
  19.     int count = (int)strlen(ch);
  20.    
  21.     //嵌套的话,count值必须为偶数
  22.         if (count % 2) {
  23.         printf("您输入的这串圆括号或者大括号,不是正确的嵌套!\n");
  24.         }else{
  25.    
  26.         for (int i=0; i<count/2; i++) {
  27.             //这里取出每一个字符与已定义的"(){}"符号作比较
  28.             if ((ch[i]==bj1 && ch[count-1-i]==bj2) || (ch[i]==bj3 && ch[count-1-i]==bj4)) {
  29.                 flag = 1;
  30.             }else{
  31.                 flag = 0;
  32.                 printf("您输入的这串圆括号或者大括号,不是正确的嵌套!\n");
  33.                 break;
  34.             }
  35.         }
  36.         if (flag) {
  37.             printf("您输入的这串圆括号或者大括号,是正确的嵌套!\n");
  38.         }
  39.     }
  40.    
  41.    
  42.    
  43.     return 0;
  44. }

复制代码


大概就这样了,看看合不合适,先吃饭去了.
作者: a_skting    时间: 2016-4-24 15:53
yaomars 发表于 2016-4-24 11:37
大概就这样了,看看合不合适,先吃饭去了.

不太对哦……正确的嵌套不一定是对等的,({()}{}())这也是正确的。({)}这是错误的。
作者: a_skting    时间: 2016-4-24 21:11
没有大神帮我一下嘛。。。。。。论坛里的大神呢。。。
作者: huangyueqil    时间: 2016-4-24 21:59
唉,只学了C语言的基础,看不懂
作者: a_skting    时间: 2016-4-24 23:41
#include <stdio.h>

#define CONTENTS_SIZE 100
#define TURE 1
#define FALSE 0

typedef int Bool;

int main()
{
    // 1,get message --> array[]
    // 2,judgement --> *p
    // 3,printf
    char contents[CONTENTS_SIZE];
    char stack_contents[CONTENTS_SIZE];
    char *top = stack_contents;
    Bool flag = FALSE;
   
    printf("Enter parenteses and / or braces :");
    for(int i = 0; i < CONTENTS_SIZE; i++)
    {
        rewind(stdin);
        scanf("%c", &contents[i]);
        
        if(contents[i] == '\n')
            break;
        
        if(contents[i] == '{' || contents[i] == '(')
        {
            *top++ = contents[i];
            continue;
        }
        if(contents[i] == '}' || contents[i] == ')')
        {
            top--;
            if((contents[i] == '}' && *top == '{' )||(contents[i] = ')' && *top == '('))
            {
                flag = TURE;
            }
        }
    }       
   
    if(flag == TURE)
        printf("Parentsese/braces are nested properly.\n");
    else
        printf("Paarentsese/braces are not nested properly.\n");
                               
    return 0;
}
作者: a_skting    时间: 2016-4-24 23:42
这是我写的。。。必须输入一个字符按一下回车才能正确判定。。如果一次性输入多个括号字符不能正确判定了。。该怎么修改呢。。。
作者: 左鹏辉2016    时间: 2016-4-25 00:46
大神 我也来看看 嘿嘿
作者: 叶子哥    时间: 2016-4-25 20:30
a_skting 发表于 2016-4-24 23:42
这是我写的。。。必须输入一个字符按一下回车才能正确判定。。如果一次性输入多个括号字符不能正确判定了。 ...
  1. #include <stdio.h>

  2. #define CONTENTS_SIZE 100

  3. int main()
  4. {
  5.     // 1,get message --> array[]
  6.     // 2,judgement --> *p
  7.     // 3,printf
  8.     char contents[CONTENTS_SIZE];
  9.     char stack_contents[CONTENTS_SIZE];
  10.     char *top = stack_contents;
  11.     int  flag = 0;   //判断标志
  12.    
  13.     printf("Enter parenteses and / or braces :");
  14.     //接受输入的字符串
  15.     scanf("%s", contents);
  16.     int count = (int)strlen(contents);
  17.    
  18.     for(int i = 0; i < count; i++)
  19.     {
  20.         if(contents[i] == '{' || contents[i] == '(')
  21.         {
  22.             //先把contents[i]赋值给*top,再top++指向下一个地址
  23.             *top = contents[i];
  24.             top ++;
  25.             
  26.         }
  27.         else if(contents[i] == '}' || contents[i] == ')')
  28.         {
  29.             top--;    //指向上一个指针
  30.             if((contents[i] == '}' && *top == '{' )||(contents[i] = ')' && *top == '('))
  31.             {
  32.                 flag = 1;
  33.             }
  34.             else
  35.             {
  36.                 flag = 0;
  37.                 break;
  38.             }
  39.         }
  40.     }
  41.    
  42.     if(flag)
  43.     {
  44.         printf("Parentsese/braces are nested properly.\n");
  45.     }else
  46.     {
  47.         printf("Parentsese/braces are not nested properly.\n");
  48.     }
  49.     return 0;
  50. }
复制代码


这样就可以直接输入了...稍微优化了下代码,执行高些>>
作者: tongtian    时间: 2016-4-25 21:35
加油加油加油加油
作者: 忆々疯ラ萧萧    时间: 2016-4-25 22:27
额.........原来学过,待想想查查
作者: Cathy    时间: 2016-5-4 15:46
a_skting 发表于 2016-4-24 23:41
#include

#define CONTENTS_SIZE 100

菜鸟的我表示木有看懂勒
作者: 简约无处不在    时间: 2016-5-6 23:22
加油加油加油加油




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2