PTA-符号配对(C++实现)

符号配对

请编写程序检查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

解题思路

从头遍历:
1.遇到左符号:入栈;
2.遇到右符号:若此时栈空则表示当前右符号缺少与之匹配的左符号,跳出循环;栈不空,则与栈顶元素进行配对,若配对成功则栈顶符号出栈,否则跳出循环。
遍历结束后,若栈空(除上述栈空的情况外)则说明全部符号均配对成功。

源代码

#include
#include
using namespace std;

//#define ERROR NULL
const int MaxSize=109;
typedef char ElementType;

struct Stack{
    ElementType Symbol[MaxSize];
    int Top;
};

Stack* Create();
bool Push(Stack* S,ElementType X);
ElementType Pop(Stack* S);
ElementType getTop(Stack* S);///获取栈顶元素

int main()
{
    Stack* S=Create();
    char str[1000],stacktop;
    int i,flag=0,flag2=0,flag_i=0;
    while(true)
    {
        cin.getline(str,1000);  ///用gets发生编译错误
        if(str[0]=='.') break;///一行一行地读取,遇到'.'时结束
        for(i=0;str[i]!='\0';i++)
        {
            flag_i=0;
            /** 遇到左符号,入栈*/
            if(str[i]=='('||str[i]=='['||str[i]=='{')
                Push(S,str[i]);
            if(str[i]=='/'&&str[i+1]=='*')
            {
                flag_i=1;///遇到/*的标志
                Push(S,str[i]);
                Push(S,str[i+1]);
            ///    i++; 若在此处使i++,则下面的if语句中i值被改变
            }
            /** 遇到右符号,与栈顶符号配对*/
            if(str[i]==')')
            {
                if(S->Top==-1)///栈为空,则当前右符号缺少左符号,结束循环
                {
                    cout<<"NO"<<endl;
                    cout<<"?-"<<str[i]<<endl;
                    flag=1;///栈空时判断是否YES的标志
                    flag2=1;///跳出while循环的标志
                    break;
                }
                stacktop=getTop(S);
                if(stacktop!='(')///栈顶元素与当前右符号不匹配,结束循环
                {
                    flag2=1;
                    break;
                }
                else
                    Pop(S); ///匹配则出栈
            }
            if(str[i]==']')
            {
                if(S->Top==-1)
                {
                    cout<<"NO"<<endl;
                    cout<<"?-"<<str[i]<<endl;
                    flag=1;
                    flag2=1;
                    break;
                }
                stacktop=getTop(S);
                if(stacktop!='[')
                {
                    flag2=1;
                    break;
                }
                else
                    Pop(S);
            }
            if(str[i]=='}')
            {
                if(S->Top==-1)
                {
                    cout<<"NO"<<endl;
                    cout<<"?-"<<str[i]<<endl;
                    flag=1;
                    flag2=1;
                    break;
                }
                stacktop=getTop(S);
                if(stacktop!='{')
                {
                    flag2=1;
                    break;
                }
                else
                    Pop(S);
            }
            if(str[i]=='*'&&str[i+1]=='/')
            {
                if(S->Top==-1)
                {
                    cout<<"NO"<<endl;
                    cout<<"?-*/"<<endl;
                    flag=1;flag2=1;
                    break;
                }
                stacktop=getTop(S);
                if(stacktop!='*')
                {
                    flag2=1;
                    break;
                }
                else
                {
                    Pop(S);
                    Pop(S);
                }
                i++;/// */比较完毕后i同样++
            }
            if(flag_i)
                i++;/// 缺少该语句将使 /*/ 被判定为配对成功
        }
        if(flag2)
            break;
    }
    if(S->Top!=-1)///栈不空,则栈顶元素缺少右符号
    {
        cout<<"NO"<<endl; ///YES NO 注意大写
        if(getTop(S)=='*')
            cout<<"/*-?"<<endl;
        else
            cout<<Pop(S)<<"-?"<<endl;
    }
    else if(!flag)///栈空且flag==0,全部配对成功
        cout<<"YES"<<endl;

    system("pause");
    delete S;
    
    return 0;
}

Stack* Create()
{
    Stack* S=new Stack;
    S->Top=-1;
    return S;
}

bool Push(Stack* S,ElementType X)
{
    if(S->Top==MaxSize-1)
        return false;
    S->Symbol[++(S->Top)]=X;
    return true;
}

ElementType Pop(Stack* S)
{
   // if(S->Top==-1)
      //  return ERROR;
    return S->Symbol[(S->Top)--];
}

ElementType getTop(Stack* S)
{
    ElementType top=Pop(S);
    Push(S,top);
    return top;
}

你可能感兴趣的:(PTA-符号配对(C++实现))