请编写程序检查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>
using namespace std;
typedef struct
{
char *base;
char * top;
int size;
}mstack;
int init(mstack &s)
{
s.base=new char[100];
if(!s.base)exit(OVERFLOW);
s.top=s.base;
s.size=100;
}
int push(mstack &s,char a)
{
if(s.top-s.base==s.size)return 0;//zhanman
*s.top=a;
s.top++;
return 1;
}
int pop(mstack &s)
{
if(s.top==s.base)
return 0;//kong
s.top--;
}
bool empty(mstack &s)
{
if(s.top==s.base)
return true;
else
return false;
}
char get(mstack &s)
{
if(s.top!=s.base)
return *(s.top-1);
}
int main()
{
mstack s;
init(s);
char x[101];
int flag=1;
while(scanf("%s", &x)!= EOF)
{
if(x[0]=='.'&&x[1]==0)
break;
int i;
for(i=0;x[i];i++)
{
if(x[i]=='('||x[i]=='{'||x[i]=='[')
{push(s,x[i]);}
if(x[i]==']')
{ if(empty(s))
{
push(s,x[i]);
flag=0;
}
if(!empty(s)&&get(s)=='[')
pop(s);
else
{
flag=0;
}
}
if(x[i]==')')
{if(empty(s))
{push(s,x[i]);
flag=0;
}
if(!empty(s)&&get(s)=='(')
pop(s);
else
{
flag=0;
}
}
if(x[i]=='}')
{
if(empty(s))
{push(s,x[i]);
flag=0;
}
if(get(s)=='{')
pop(s);
else
{
flag=0;
}
}
if(x[i]=='/')
{
if(x[i+1]=='*')
push(s,'a');
i+=2;
//break;
}
if(x[i]=='*'&&x[i+1]=='/')
{
if(get(s)=='a')
pop(s);
else
{
flag=0;
push(s,'b');
}
}
/*if(x[i]=='*')
{
if(x[i+1]=='/')
{
if(get(s)=='*')
{
pop(s);
if(get(s)=='/')
pop(s);
//break;
else
{
push(s,'/');
flag=0;
break;
}
}
else
{
push(s,'/');
//i+=2;
flag=0;
break;
}
}
}
*/
/*if(x[i]=='/')
{
if(get(s)=='/')
pop(s);
else
push(s,'/');
}
if(x[i]=='*')
{
//if(x[i-1]=='/'&&x[i-2]=='*')
if(get(s)=='*')
pop(s);
if(x[i-1]=='/'&&x[i-2]!='*')
push(s,'*');
}*/
if(flag==0)
break;
}
}
if(empty(s))
printf("YES");
else
{ printf("NO\n");
if(get(s)=='{'||get(s)=='('||get(s)=='[')
printf("%c-?",get(s));
if(get(s)=='}'||get(s)==')'||get(s)==']')
printf("?-%c",get(s));
if(get(s)=='a')
printf("/*-?");
if(get(s)=='b')
printf("?-*/");
}
//cout<<" "<<get(s)<<" "<<*(s.top-2)<<" "<<*(s.top-3);
}