2014-06-16 18:03:58
题意&思路:括号平衡匹配。2个版本
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <iostream> 5 using namespace std; 6 7 int main(){ 8 char s[130],t; 9 int n,used[130]; 10 scanf("%d",&n); 11 getchar(); 12 while(n--){ 13 memset(used,0,sizeof(used)); 14 int len = 0; 15 while(scanf("%c",&t) == 1){ 16 if(t == '\n') break; 17 s[len++] = t; 18 } 19 s[len] = '\0'; 20 int i,j,flag = 1; 21 while(flag){ 22 flag = 0; 23 for(i = 0; i < len - 1; ++i){ 24 if(!used[i] && (s[i] == '(' || s[i] == '[')){ 25 for(j = i + 1; j < len; ++j){ 26 if(!used[j]) 27 break; 28 } 29 if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')){ 30 //printf("%d %d\n",i,j); 31 flag = 1; 32 used[i] = used[j] = 1; 33 } 34 } 35 } 36 } 37 for(i = 0; i < len; ++i){ 38 if(!used[i]){ 39 printf("No\n"); 40 break; 41 } 42 } 43 if(i >= len) 44 printf("Yes\n"); 45 } 46 return 0; 47 }
1 #include <iostream> 2 #include <cstdio> 3 #include <stack> 4 using namespace std; 5 int main(){ 6 stack<char> s; 7 int n; 8 char t; 9 cin >> n; 10 getchar(); 11 while(n--){ 12 while(!s.empty()) s.pop(); 13 while(scanf("%c",&t) == 1){ 14 if(t == '\n') break; 15 if(!s.empty() && ((s.top() == '(' && t == ')') || (s.top() == '[' && t == ']'))) 16 s.pop(); 17 else 18 s.push(t); 19 } 20 if(s.empty()) cout << "Yes" << endl; 21 else cout << "No" << endl; 22 } 23 return 0; 24 }