zoukankan      html  css  js  c++  java
  • PTA 7-2 符号配对(20 分)

    7-2 符号配对(20 分)

    请编写程序检查C语言源程序中下列符号是否配对:/**/()[]{}

    输入格式:

    输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

    输出格式:

    首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?

    输入样例1:

    void test()
    {
        int i, A[10];
        for (i=0; i<10; i++) /*/
            A[i] = i;
    }
    .
    

    输出样例1:

    NO
    /*-?
    

    输入样例2:

    void test()
    {
        int i, A[10];
        for (i=0; i<10; i++) /**/
            A[i] = i;
    }]
    .
    

    输出样例2:

    NO
    ?-]
    

    输入样例3:

    void test()
    {
        int i
        double A[10];
        for (i=0; i<10; i++) /**/
            A[i] = 0.1*i;
    }
    .
    

    输出样例3:

    YES
    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<malloc.h>
    #include<stdlib.h>
    #include<string.h>
    #include<cstring>
    #define STACK_INIT_SIZE 10000
    #define STACKINCREMENT 10
    #define TRUE        1
    #define FALSE       0
    #define OK          1
    #define ERROR       0
    #define INFEASIBLE -1
    #define OVERFLOW   -2
    using namespace std;
    typedef char SElemType,Status;
    typedef struct
    {
        SElemType *base;
        SElemType *top;
        int stacksize;
    } Stack;
    Status InitStack(Stack &S)
    {
        S.base=(SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
        if(!S.base)
            exit(OVERFLOW);
        S.top=S.base;
        S.stacksize=STACK_INIT_SIZE;
        return OK;
    }
    Status Push(Stack &S,SElemType e)
    {
        if(S.top-S.base>=S.stacksize)
        {
            S.base=(SElemType*)malloc(sizeof(SElemType)*(S.stacksize+STACKINCREMENT));
            if(!S.base)
                exit(OVERFLOW);
            S.top=S.base+S.stacksize;
            S.stacksize+=STACKINCREMENT;
        }
        *S.top++=e;
        return OK;
    
    }
    Status Pop(Stack &S)
    {
        if(S.top==S.base)
            return ERROR;
        S.top--;
        return OK;
    }
    Status GetTop(Stack &S,SElemType &e)
    {
        if(S.base==S.top)
            return ERROR;
        e=*(S.top-1);
        return OK;
    }
    const int maxn=1000+5;
    char s[maxn];
    bool Find(Stack &S,char ch)
    {
        char tmp[maxn];
        memset(tmp,'
    ',sizeof(tmp));
        int num=0;
        while(S.top!=S.base)
        {
            SElemType e2;
            GetTop(S,e2);
            if(e2==ch)
            {
                Pop(S);
                for(int i=num-1; i>=0; i--)
                    Push(S,tmp[i]);
                return true;
            }
            else
            {
                tmp[num++]=e2;
            }
            Pop(S);
        }
        for(int i=num-1; i>=0; i--)
            Push(S,tmp[i]);
        return false;
    }
    void judge(char ch)
    {
        if(ch=='(')
         printf("(-?
    ");
         else if(ch=='[')
            printf("[-?
    ");
         else if(ch=='{')
            printf("{-?
    ");
         else if(ch=='<')
            printf("/*-?
    ");
    }
    int main()
    {
        Stack Sta;
        InitStack(Sta);
        int flag=1;
        while(gets(s))
        {
            if(s[0]=='.') break;
            int len=strlen(s);
            for(int i=0;i<strlen(s);i++)
            {
                if(s[i]=='('||s[i]=='['||s[i]=='{')
                    Push(Sta,s[i]);
                else if(s[i]=='/'&&s[i+1]=='*'&&i+1<len)
                {
                    ++i;
                   Push(Sta,'<');
                }
    
                else if(s[i]==')')
                {
    
                    if(Sta.top!=Sta.base)
                    {
                        SElemType e;
                        GetTop(Sta,e);
                        if(e=='(')
                            Pop(Sta);
                        else if(flag)
                        {
                            printf("NO
    ");
                            flag=0;
                            judge(e);
                        }
                    }
                    else if(flag)
                    {
                        flag=0;
                        printf("NO
    ");
                        printf("?-)
    ");
                    }
    
    
                }
                else if(s[i]==']')
                {
    
                    if(Sta.top!=Sta.base)
                    {
                        SElemType e;
                        GetTop(Sta,e);
                        if(e=='[')
                            Pop(Sta);
                        else if(flag)
                        {
                            printf("NO
    ");
                            flag=0;
                            judge(e);
                        }
                    }
                    else if(flag)
                    {
                        flag=0;
                        printf("NO
    ");
                         printf("?-]
    ");
                    }
    
    
                }
                else if(s[i]=='}')
                {
    
                    if(Sta.top!=Sta.base)
                    {
                        SElemType e;
                        GetTop(Sta,e);
                        if(e=='{')
                            Pop(Sta);
                        else if(flag)
                        {
                            printf("NO
    ");
                            flag=0;
                            judge(e);
                        }
                    }
                    else if(flag)
                    {
                        flag=0;
                        printf("NO
    ");
                         printf("?-}
    ");
                    }
    
    
                }
                else if(s[i]=='*'&&s[i+1]=='/'&&i+1<len)
                {
                    ++i;
                    if(Sta.top!=Sta.base)
                    {
                        SElemType e;
                        GetTop(Sta,e);
                        if(e=='<')
                            Pop(Sta);
                        else if(flag)
                        {
                            printf("NO
    ");
                            flag=0;
                            judge(e);
                        }
                    }
                    else if(flag)
                    {
                        flag=0;
                        printf("NO
    ");
                        printf("?-*/
    ");
                    }
    
                }
            }
        }
       if(flag)
       {
           if(Sta.base==Sta.top)
            printf("YES
    ");
           else
           {
               SElemType e;
               GetTop(Sta,e);
               printf("NO
    ");
               judge(e);
           }
       }
    }
    

      

  • 相关阅读:
    js相关小实例——大图轮播
    js相关小实例——div实现下拉菜单
    js相关小实例——二级菜单
    html5部分相关
    CSS3常用属性(边框、背景、文本效果、2D转换、3D转换、过渡、有过渡效果大图轮播、动画)
    数据访问
    php测试
    单例模式
    Doc
    横竖列表 下拉隐藏显示
  • 原文地址:https://www.cnblogs.com/masterchd/p/7801416.html
Copyright © 2011-2022 走看看