请编写程序检查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
AC代码:
#include<bits/stdc++.h>
#include <unordered_map>
using namespace std;
int main()
{
//将"/*"替换为"<" ,"*/"替换为">"
int ans=1;
vector<char> qu;
string ch;
stack<char> st;
unordered_map<char,char> book;
book['(']=')';
book['{']='}';
book['<']='>';
book['[']=']';
while(ch!="."){
getline(cin,ch);
int cl=ch.length();
for(int i=0;i<cl;i++)
{
if(ch[i]=='('||ch[i]==')'||ch[i]=='['||ch[i]==']'||ch[i]=='{'||ch[i]=='}')
{
qu.push_back(ch[i]);
}
if(ch[i]=='/'&&ch[i+1]=='*')
{
qu.push_back('<');
i++;
}
else if (ch[i]=='*'&&ch[i+1]=='/')
{
qu.push_back('>');
i++;
}
}
}
int ql=qu.size();
int i;
for(i=0;i<ql;i++)
{
if(qu[i]=='('||qu[i]=='<'||qu[i]=='['||qu[i]=='{')
{
st.push(qu[i]);
}else{
if(st.size()!=0&&book[st.top()]!=qu[i])
{
cout<<"NO"<<endl;
ans=0;
if(st.top()=='<')
{
cout<<"/*-?"<<endl;
}
else {
cout<<st.top()<<"-?"<<endl;
}
break;
}
if(st.size()==0)
{
cout<<"NO"<<endl;
ans=0;
if(qu[i]=='>')
{
cout<<"?-*/"<<endl;
}
else {
cout<<"?-"<<qu[i]<<endl;
}
break;
}
st.pop();
}
}
if(!st.empty()&&ans!=0)
{
cout<<"NO"<<endl;
ans=0;
if(st.top()=='<')
{
cout<<"/*-?"<<endl;
}
else {
cout<<st.top()<<"-?"<<endl;
}
}
if(ans)
{
cout<<"YES"<<endl;
}
return 0;
}