7-2 符号配对 (20分)
请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
stack <char> z;
int bk=1;
while(getline(cin,s)){
if(s=="."){
break;
}
for(int i=0;i<s.length();i++){
if(s[i]=='('||s[i]=='{'||s[i]=='['){
z.push(s[i]);
}
else if(s[i]=='/'&&s[i+1]=='*'){
z.push('<');
i++;
}
else if(s[i]==')'||s[i]=='}'||s[i]==']'){
if(z.empty()){
cout<<"NO"<<endl;
cout<<"?-"<<s[i]<<endl;
return 0;
}
char q=z.top();
z.pop();
if(q!='('&&s[i]==')'){
cout<<"NO"<<endl;
if(q=='<') cout<<"/*-?"<<endl;
else cout<<q<<"-?"<<endl;
return 0;
}
else if(q!='['&&s[i]==']'){
cout<<"NO"<<endl;
if(q=='<') cout<<"/*-?"<<endl;
else cout<<q<<"-?"<<endl;
return 0;
}
else if(q!='{'&&s[i]=='}'){
cout<<"NO"<<endl;
if(q=='<') cout<<"/*-?"<<endl;
else cout<<q<<"-?"<<endl;
return 0;
}
}
else if(s[i]=='*'&&s[i+1]=='/'){
if(z.empty()){
cout<<"NO"<<endl;
cout<<"?-"<<s[i]<<s[i+1]<<endl;
return 0;
}
i++;///************//
char q1=0;
q1=z.top();
z.pop();
if(q1!='<'){
cout<<"NO"<<endl;
cout<<q1<<"-?"<<endl;
return 0;
}
}
}
if(bk==0) break;
}
if(z.empty()) cout<<"YES"<<endl;
else {
char q1=z.top();
z.pop();
if(q1!='<'){
cout<<"NO"<<endl;
cout<<q1<<"-?"<<endl;
}
else{
cout<<"NO"<<endl;
cout<<"/*-?"<<endl;
}
}
}