描述
今天发现了nyoj,如获至宝。准备开刷。
括号配对问题
现在,有一行括号序列,请你检查这行括号是否配对。
- 输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入
-
3[(])(])([[]()])
样例输出 -
NoNoYes 开始想的比较简单,直接计数。后来发现题目比想象的复杂,只好用栈来实现了。
1 #include
2 #include 3 #include 4 5 using namespace std; 6 7 char s[10002]; 8 stack temp; 9 10 bool isOk() {11 int len = strlen(s);12 for(int i = 0; i < len; i++) {13 if(s[i] == '(') {14 temp.push('(');15 }16 if(s[i] == ')') {17 if(temp.empty()) {18 return false;19 }20 if(temp.top() != '(') {21 return false;22 }23 else {24 temp.pop();25 }26 }27 if(s[i] == '[') {28 temp.push('[');29 }30 if(s[i] == ']') {31 if(temp.empty()) {32 return false;33 }34 if(temp.top() != '[') {35 return false;36 }37 else {38 temp.pop();39 }40 }41 }42 if(temp.empty()) {43 return true;44 }45 return false;46 }47 48 int main(int argc, char const *argv[])49 {50 int n;51 while(scanf("%d",&n) != EOF) {52 while(n--) {53 scanf("%s",s);54 while(!temp.empty()) {55 temp.pop();56 }57 58 if(isOk()) {59 puts("Yes");60 }61 else {62 puts("No");63 64 }65 }66 }67 return 0;68 }