这里我没有用堆栈。直接用一个数组input[SIZE]接收用户的输入,在遍历数组,对数组进行操作。已经匹配好的括弧直接用#号覆盖,最后遍历数组。如果数组只有#号,没有其他元素,则匹配。否则不匹配。
1 /* 2 *判断括弧是否匹配 3 */ 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 9 #define SIZE 10000 10 #define FALSE 0 11 #define TRUE 1 12 13 int main() 14 { 15 char input[SIZE]; //存放输入 16 17 int point_first = 0; //遍历每一次的输入的指针 18 int point_last = 0; 19 int flag = TRUE; //flag = TRUE括号匹配 flag = FALSE括号不匹配 20 int num = 0; //一共要处理多少次输入 21 int length = 0; 22 int i = 0; 23 24 25 scanf("%d", &num); 26 27 while(num > 0) //处理每一次输入 28 { 29 i = 0; 30 flag = TRUE; 31 scanf("%s", input); 32 length = strlen(input); 33 for(point_first = 0; point_first < length; point_first ++) 34 { 35 if(input[point_first] == ')' || input[point_first] == ']') //如果遇到)或者]向前找匹配的括弧,将其变成# 36 { 37 point_last = point_first - 1; 38 39 for(; point_last >= 0 && input[point_last] == '#'; point_last --); //向前遍历 40 41 if(point_last >= 0) 42 if((input[point_first] == ')' && input[point_last] == '(') || (input[point_first] == ']' && input[point_last] == '[')) 43 { 44 input[point_last] = '#'; 45 input[point_first] = '#'; 46 } 47 else 48 break; 49 else 50 break; 51 } 52 } 53 while(i < length) 54 { 55 if(input[i] != '#') 56 flag = FALSE; 57 i++; 58 } 59 if(flag == FALSE) 60 printf("%s ", "No"); 61 else 62 printf("%s ", "Yes"); 63 64 num --; 65 } 66 67 }