请编写程序检查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 <iostream> #include <map> #include <algorithm> #include <stack> #define eof "." using namespace std; int main() { string s; char a[101],b[101]; int d = 0,c = 0; int flag = 1; map<char,char> q; q['('] = ')'; q['{'] = '}'; q['['] = ']'; q['<'] = '>'; while(cin>>s&&s != eof) { for(int j = 0;j < s.size();j ++) { if(s[j] == '[' || s[j] == ']' || s[j] == '{' || s[j] == '}' || s[j] == '(' || s[j] == ')')a[d ++] = s[j]; else if(s[j] == '/' && s[j+1] == '*')a[d ++] = '<',j ++; else if(s[j] == '*' && s[j+1] == '/')a[d ++] = '>',j ++; } } int j; // a[d]=' '; // cout<<a<<endl; for(j = 0;j < d;j ++) { if(a[j] == '(' || a[j] == '[' || a[j] == '{' || a[j] == '<') { b[c ++] = a[j]; } else if(c&&q[b[c-1]] == a[j])c --; else { flag = 0; cout<<"NO"<<endl; if(!c) { if(a[j]=='>')cout<<"?-*/"; else cout<<"?-"<<a[j]; } else { if(b[c - 1] == '<')cout<<"/*-?"; else cout<<b[c - 1]<<"-?"; } break; } } if(flag) { if(!c)cout<<"YES"<<endl; else { cout<<"NO"<<endl; if(b[c - 1] == '<')cout<<"/*-?"; else cout<<b[c - 1]<<"-?"; } } }