鱼C论坛

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

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

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

马上注册,结交更多好友,享用更多功能^_^

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

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;
}








想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-20 13:18:32 | 显示全部楼层
#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");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");printf ("?-%c", 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-3 10:30:12 | 显示全部楼层
这两个都不能运行吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 21:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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