鱼C论坛

 找回密码
 立即注册
查看: 580|回复: 2

括号匹配,写的麻烦,运行超时,希望大佬们给看一下

[复制链接]
最佳答案
0 
发表于 2017-9-30 08:08:55 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>


#define STACK_INIT_SIZE 20
#define STACKINCREMENT  10
#define MAXBUFFER       10
typedef char ElemType;
typedef struct
{
     ElemType *base;
     ElemType *top;
     int stacksize;
}SqStack;


void InitStack(SqStack &S)
{
     S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
     if (!S.base)exit(OVERFLOW);
     S.top=S.base;
     S.stacksize=STACK_INIT_SIZE;
     return;
}

void Push(SqStack &S,ElemType e)
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (ElemType));
        if(!S.base)exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return;
}

void Pop(SqStack &S,ElemType &e)
{
     if (S.top==S.base){return;};
     e=*--S.top;
}


int StackLen(SqStack S)
{
     return(S.top-S.base);
}


int main()
{
     SqStack S;
     char c,e;
     InitStack(S);
     scanf ("%c",c);//读入c
     while(c!='.')
     {
         switch(c)
         {
         case '(':
         case '[':
         case '{':
         Push(S,c);//如果是开始符,则入栈
         scanf("%c",c);//读入下一个符号
         if ('.'==c)
         {Pop(S,e);printf("NO\n",e);printf("%c-?",e);}//当开始符后面的符号直接是'.'的话,直接输出
         else break;//包含第一个字符是开始符的情况
         case '/':
         Push(S,c);
         scanf ("%c",c);
         Push(S,c);
         do
             {
                 scanf ("%c",c);
             }while (c!='*'&&c!='.');
            if ('*'==c)
            {
                Push(S,c);
                scanf("%c",c);
                Push(S,c);
                scanf ("%c",c);
                break;
            }
             else {printf("NO\n");printf("/*-?");}
             break;
         case '*':
         printf ("NO\n");
         printf("?-*/");
         c='.';
         break;
         case ')':
         if (!StackLen(S)){printf("NO\n",c);printf ("?-%c");}
         else
         {
             Pop(S,e);
             if ('('!=e){printf("NO\n");printf("?-)");}
             else if('('==e)scanf("%c",c);
         }break;
          case ']':
         if (!StackLen(S)){printf("NO");printf("\n?-]");}
         else
         {
             Pop(S,e);
             if ('['!=e){printf("NO\n");printf("?-]");}
             else if('['==e)scanf ("%c",c);
         }break;
          case '}':
         if (!StackLen(S))printf("NO\n?-}");
         else
         {
             Pop(S,e);
             if ('{'!=e){printf("NO\n");printf("?-}");}
             else if('{'==e)scanf("%c",c);
         }break;
         }
     }
     if (!StackLen(S))printf ("\nYES");
     return 0;
}








最佳答案
22 
发表于 2017-10-20 13:18:32 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <math.h>


  5. #define STACK_INIT_SIZE 20
  6. #define STACKINCREMENT  10
  7. #define MAXBUFFER       10
  8. typedef char ElemType;
  9. typedef struct
  10. {
  11.      ElemType *base;
  12.      ElemType *top;
  13.      int stacksize;
  14. }SqStack;


  15. void InitStack(SqStack *S)
  16. {
  17.      S->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
  18.      if (!S->base)exit(OVERFLOW);
  19.      S->top=S->base;
  20.      S->stacksize=STACK_INIT_SIZE;
  21.      return;
  22. }

  23. void Push(SqStack *S, ElemType e)
  24. {
  25.     if(S->top-S->base>=S->stacksize)
  26.     {
  27.         S->base=(ElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof (ElemType));
  28.         if(!S->base)
  29.                         exit(OVERFLOW);
  30.         S->top=S->base+S->stacksize;
  31.         S->stacksize+=STACKINCREMENT;
  32.     }
  33.     *S->top++=e;
  34.     return;
  35. }

  36. void Pop(SqStack *S, ElemType *e)
  37. {
  38.     if (S->top==S->base)
  39.         {
  40.                 return;
  41.         };
  42.     e=--S->top;
  43. }


  44. int StackLen(SqStack S)
  45. {
  46.      return(S.top-S.base);
  47. }


  48. int main()
  49. {
  50.      SqStack S;
  51.      char c,e;
  52.      InitStack(&S);
  53.      scanf("%c",&c);//读入c
  54.      while(c!='.')
  55.      {
  56.          switch(c)
  57.          {
  58.          case '(':
  59.          case '[':
  60.          case '{':
  61.          Push(&S,c);//如果是开始符,则入栈
  62.          scanf("%c",&c);//读入下一个符号
  63.          if ('.'==c)
  64.          {Pop(&S,&e);printf("NO\n");printf("%c-?",e);}//当开始符后面的符号直接是'.'的话,直接输出
  65.          else break;//包含第一个字符是开始符的情况
  66.          case '/':
  67.          Push(&S,c);
  68.          scanf("%c",&c);
  69.          Push(&S,c);
  70.          do
  71.              {
  72.                  scanf("%c",&c);
  73.              }while (c!='*'&&c!='.');
  74.             if ('*'==c)
  75.             {
  76.                 Push(&S,c);
  77.                 scanf("%c",&c);
  78.                 Push(&S,c);
  79.                 scanf("%c",&c);
  80.                 break;
  81.             }
  82.              else {printf("NO\n");printf("/*-?");}
  83.              break;
  84.          case '*':
  85.          printf ("NO\n");
  86.          printf("?-*/");
  87.          c='.';
  88.          break;
  89.          case ')':
  90.          if (!StackLen(S)){printf("NO\n");printf ("?-%c", c);}
  91.          else
  92.          {
  93.              Pop(&S,&e);
  94.              if ('('!=e){printf("NO\n");printf("?-)");}
  95.              else if('('==e)scanf("%c",&c);
  96.          }break;
  97.           case ']':
  98.          if (!StackLen(S)){printf("NO");printf("\n?-]");}
  99.          else
  100.          {
  101.              Pop(&S,&e);
  102.              if ('['!=e){printf("NO\n");printf("?-]");}
  103.              else if('['==e)scanf("%c",&c);
  104.          }break;
  105.           case '}':
  106.          if (!StackLen(S))printf("NO\n?-}");
  107.          else
  108.          {
  109.              Pop(&S,&e);
  110.              if ('{'!=e){printf("NO\n");printf("?-}");}
  111.              else if('{'==e)scanf("%c",&c);
  112.          }break;
  113.          }
  114.      }
  115.      if (!StackLen(S))printf ("\nYES");
  116.      return 0;
  117. }
复制代码
最佳答案
0 
发表于 2018-2-3 10:30:12 | 显示全部楼层
这两个都不能运行吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2018-8-19 08:19

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表