#include<bits/stdc++.h>
using namespace std;


#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;
}SqStack;
Status InitStack(SqStack &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(SqStack &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(SqStack &S)
{
    if (S.top == S.base)
        return ERROR;
    S.top--;
    return OK;
}
Status GetTop(SqStack &S, SElemType &e)
{
    if (S.base == S.top)
        return ERROR;
    e = *(S.top - 1);
    return OK;
}
Status Empty(SqStack S)
{
    if (S.top == S.base)
        return OK;
    else
        return ERROR;
}


const int maxn = 1000 + 5;
char s[maxn];
bool Find(SqStack &S, char ch)
{
    char tmp[maxn]; //初始化为“\n”;
    memset(tmp, '\n', sizeof(tmp)); //Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
    int num = 0; 
    while (!Empty)
    {
        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");
}

void fun(SqStack &Sta, char ch)
{
    int flag = 1;;
    if (!Empty(S)
    {
        SElemType e;
        GetTop(Sta, e);
        if (e == '(')
            Pop(Sta);
        else if (flag)
        {
            printf("NO\n");
            flag = 0;
            judge(e);
        }
    }
}


int main()
{
    SqStack Sta;
    InitStack(Sta);
    int flag = 1;
    while (gets(s))
    {
        if (s[0] == '.') break;
        int len = strlen(s);
        for (int i = 0; i < len; 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 (!Empty(Sta)
                {
                    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 (!Empty(Sta)
                {
                    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 (!Empty(Sta)
                {
                    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 (!Empty(Sta)
                {
                    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 (!Empty(Sta)
            printf("YES\n");
        else
        {
            SElemType e;
            GetTop(Sta, e);
            printf("NO\n");
            judge(e);
        }
    }
}
View Code
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