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,'\n',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("(-?\n");
     else if(ch=='[')
        printf("[-?\n");
     else if(ch=='{')
        printf("{-?\n");
     else if(ch=='<')
        printf("/*-?\n");
}
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\n");
                        flag=0;
                        judge(e);
                    }
                }
                else if(flag)
                {
                    flag=0;
                    printf("NO\n");
                    printf("?-)\n");
                }


            }
            else if(s[i]==']')
            {

                if(Sta.top!=Sta.base)
                {
                    SElemType e;
                    GetTop(Sta,e);
                    if(e=='[')
                        Pop(Sta);
                    else if(flag)
                    {
                        printf("NO\n");
                        flag=0;
                        judge(e);
                    }
                }
                else if(flag)
                {
                    flag=0;
                    printf("NO\n");
                     printf("?-]\n");
                }


            }
            else if(s[i]=='}')
            {

                if(Sta.top!=Sta.base)
                {
                    SElemType e;
                    GetTop(Sta,e);
                    if(e=='{')
                        Pop(Sta);
                    else if(flag)
                    {
                        printf("NO\n");
                        flag=0;
                        judge(e);
                    }
                }
                else if(flag)
                {
                    flag=0;
                    printf("NO\n");
                     printf("?-}\n");
                }


            }
            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\n");
                        flag=0;
                        judge(e);
                    }
                }
                else if(flag)
                {
                    flag=0;
                    printf("NO\n");
                    printf("?-*/\n");
                }

            }
        }
    }
   if(flag)
   {
       if(Sta.base==Sta.top)
        printf("YES\n");
       else
       {
           SElemType e;
           GetTop(Sta,e);
           printf("NO\n");
           judge(e);
       }
   }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Kotlin 中的接口 Interface : so much betterKotlin 开发者社区

Interface was introduced in Java as a new programming feature. It describes CAN-...

975
来自专栏杂烩

spring-data-mongodb使用mongoTemplate开发示例

使用mongoTemplate比直接定义接口不用写实现那种复杂点,但有时候在一些特殊操作上,可能使用mongoTemplate更容易些。以下记录以下使用mong...

3432
来自专栏数据结构与算法

BZOJ1053: [HAOI2007]反素数ant(爆搜)

  对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x

822
来自专栏Albert陈凯

2018-09-06 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match),stringregex

字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match),stringregex

471
来自专栏何俊林

结合Android源码分析总结单例模式的几种实现方式

本文为付祥投稿,主要是结合Android源码分析总结单例模式的几种实现方式。 谈起设计模式估计大家都不会陌生,一个项目中至少会用到其中的一种模式,今天要说的主角...

4068
来自专栏积累沉淀

多人聊天室

最近学完网络线程协议 ,因此写了一个用java编写的聊天室 话不多说 效果如图 ? 首先 创建服务器端 package com.yc.server...

2868
来自专栏码匠的流水账

聊聊micrometer的HistogramGauges

针对springboot应用,配备有各种export的AutoConfiguration,详见org.springframework.boot.actuate....

1422
来自专栏HansBug's Lab

2015: [Usaco2010 Feb]Chocolate Giving

2015: [Usaco2010 Feb]Chocolate Giving Time Limit: 10 Sec  Memory Limit: 162 MB S...

2926
来自专栏Ryan Miao

JSP自定义tag

前端需要调用后端的配置,想起velocity-tools。然而jsp的话,目前只能想到tag和EL表达式了。 Tag相当好写,jsp2.0提供了简化写法: 编写...

2807
来自专栏aCloudDeveloper

Docker 基础技术之 Linux namespace 源码分析

上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,...

3584

扫码关注云+社区