括号配对问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
以下代码实现了主要功能,有不完善的地方...大家可以自己完善。
1 // 2 // main.c 3 // matching 4 // 5 // Created by scandy_yuan on 13-1-4. 6 // Copyright (c) 2013年 Sam. All rights reserved. 7 // 8 9 #include <stdio.h> 10 #include <string.h> 11 #include <stdlib.h> 12 //实际匹配函数 借鉴弹栈入栈操作 13 //str为传入的字符串,n为字符串的长度 14 void stack(char * str,size_t n) 15 { 16 //创建临时数组 17 char S[10000] = {0}; 18 //i为循环变量 k记录临时数组的下标 19 int i , k = 0; 20 //flag为标记 0表示正常 1表示失败 21 int flag = 0; 22 23 //有几个字符就循环多少次 24 for(i = 0; i < n; i++) { 25 //如果字符串的长度不是2的整数倍或者长度为1 26 //肯定不会正常匹配 27 if(n % 2 != 0||n==1) { 28 flag = 1; //将标记置为1 29 break; //直接退出循环 30 } 31 //如果为做括号则入栈 也就是放到临时数组中 32 if(str[i] == '(' || str[i] == '[') { 33 S[k] = str[i]; 34 k++; //将记录下标的k向后移动一位 35 } 36 //如果是右括号则开始根据临时数组中的左括号进行匹配 37 if(str[i] == ')') { 38 //如果此时记录下标的k已经为0了 39 //说明临时数组中不会在有和右括号匹配的左括号了 40 if(k==0) { 41 flag = 1; //将标记置1 42 break; //结束循环 43 } 44 //如果S[k-1]是左括号 则正好匹配 45 if(S[k - 1] == '(') { 46 k--;//匹配完成后将k--,相当于将左括号弹出 47 }else{ 48 //否则没有匹配的左括号,将标记置1 49 flag = 1; 50 } 51 } 52 //同上小括号匹配方式 53 if(str[i] == ']') { 54 if(k==0) { 55 flag = 1; 56 break; 57 } 58 if(S[k - 1] == '[') { 59 k--; 60 }else{ 61 flag = 1; 62 } 63 } 64 } 65 //循环结束后 如果k==0并且flag==0 说明正好完全匹配 66 if(k==0&&flag==0) { 67 printf("YES!\n"); 68 //否则 没有完全匹配 69 } else{ 70 printf("No!\n"); 71 } 72 } 73 74 //程序执行函数 75 //进行开始的一些初始化工作 76 void matching() 77 { 78 int count ; 79 printf("请输入测试次数(小于5):"); 80 scanf("%d", &count); 81 //定义一个可变长字符串数组 需要C99标准 82 char S[count][10000]; 83 for(int i = 0; i < count; i++) { 84 printf("请输入第%d组测试数据:", i + 1); 85 scanf("%s", S[i]); 86 } 87 88 printf("开始匹配...\n"); 89 //输入几个字符串就循环调用几次匹配函数 90 for(int i = 0; i < count; i++) { 91 stack(S[i],strlen(S[i])); 92 } 93 94 } 95 96 int main(int argc, const char * argv[]) 97 { 98 99 // insert code here... 100 matching(); 101 return 0; 102 }