7-3 符号配对 (20 分)

7-3 符号配对 (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<bits/stdc++.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef long long ll;
typedef int Status;
typedef struct{
    char *base;
    char *top;
    int StackSize;
}SqStack;
Status InitStack(SqStack&S){
    S.base = (char*)malloc(110*sizeof(char));
    if(!S.base) return OVERFLOW;
    S.top = S.base;
    S.StackSize = 110;
    return OK;
}
Status push(SqStack &S,char e){
    if(S.top - S.base==S.StackSize) return ERROR;
    *S.top++ = e;
    return OK;
}
Status pop(SqStack&S,char e){
    if(S.top==S.base)
        return ERROR;
    e = *--S.top;
    return OK;
}
char GetTop(SqStack S){
    if(S.top!=S.base) return *(S.top-1);
}
bool StackEmpty(SqStack&S){
    if(S.top==S.base) return true;
    return false;
}
int main()
{
    //freopen("i.txt","r",stdin);
    char s[110],str[110];
    char c;
    int cnt = 0;
    while(scanf("%s",str)!=EOF&&str[0]!='.'){
        for(int i=0;str[i];i++){
            if(str[i]=='('||str[i]=='{'||str[i]=='['||str[i]==')'||str[i]=='}'||str[i]==']')
                s[cnt++] = str[i];
            else if(str[i]=='/'&&str[i+1]=='*'){
                s[cnt++] = str[i];
                s[cnt++] = str[i+1];
                i++;
            }else if(str[i]=='*'&&str[i+1]=='/'){
                s[cnt++] = str[i];
                s[cnt++] = str[i+1];
                i++;
            }
        }
    }
    s[cnt++]='\0';
    SqStack S;
    InitStack(S);
    bool flag = true;
    for(int i=0;s[i];i++){
        if(s[i]=='('||s[i]=='{'||s[i]=='[')
            push(S,s[i]);
        else if(s[i]=='/'&&s[i+1]=='*'){
            push(S,s[i]);
            push(S,s[i+1]);
            i++;
        }
        else if(s[i]==')'){
            if(!StackEmpty(S)&&GetTop(S)=='('){
                pop(S,'(');
            }else{
                c = s[i];
                flag = false;
                break;
            }
        }
        else if(s[i]==']'){
            if(!StackEmpty(S)&&GetTop(S)=='['){
                pop(S,'[');
            }else{
                c = s[i];
                flag = false;
                break;
            }
        }
        else if(s[i]=='}'){
            if(!StackEmpty(S)&&GetTop(S)=='{'){
                pop(S,'{');
            }else{
                c = s[i];
                flag = false;
                break;
            }
        }
        else if(s[i]=='*'&&s[i+1]=='/'){
            if(!StackEmpty(S)&&GetTop(S)=='*'){
                pop(S,'*');
                if(!StackEmpty(S)&&GetTop(S)=='/')
                    pop(S,'/');
                else{
                    c = s[i];
                    flag = false;
                    break;
                }
            }else{
                c = s[i];
                flag = false;
                break;
            }
            i++;
        }
    }
    if(flag&&StackEmpty(S)) printf("YES\n");
    else{
        printf("NO\n");
        if(!StackEmpty(S)){
            char x = GetTop(S);
            if(x=='(')
                cout<<'('<<'-'<<'?'<<endl;
            else if(x=='[')
                cout<<'['<<'-'<<'?'<<endl;
            else if(x=='{')
                cout<<'{'<<'-'<<'?'<<endl;
            else if(x=='*')
                cout<<'/'<<'*'<<'-'<<'?'<<endl;
        }else{
            if(c==')')
                cout<<'?'<<'-'<<')'<<endl;
            else if(c==']')
                cout<<'?'<<'-'<<']'<<endl;
            else if(c=='}')
                cout<<'?'<<'-'<<'}'<<endl;
            else if(c=='*')
                cout<<'?'<<'-'<<'*'<<'/'<<endl;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Insist_77/article/details/82928587