請編寫程序檢查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]='\0'; // 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]<<"-?"; } } }