栈
tips:注意栈顶指针的使用,是先入栈再增加栈顶指针还是先增加栈顶指针再入栈要考虑清楚;
最后判断是否匹配的时候,由于我预先设置的flag为1,所以如果遇到全部为左括号时,跳出循环依旧是flag=1,要再增加一个栈为空的条件。
#include<stdio.h> #include<string.h> int main() { int sp; // 栈顶指针 int n; char str[1000]; char bracket[100]; int flag; // 1表示匹配,0表示不匹配 scanf("%d",&n); for(int i = 0;i<n;i++) { sp = -1; flag = 1; scanf("%s",str); for(int j =0 ;j<strlen(str);j++) { if(str[j] == '(' || str[j] == '[' || str[j] == '{') // 左括号则入栈 bracket[++sp] = str[j]; else if(str[j] == ')') // 右小括号 { if(bracket[sp]!= '(') { flag = 0; break; } sp--; } else if(str[j] == ']') // 右中括号 { if(bracket[sp]!= '[') { flag = 0; break; } sp--; } else if(str[j] == '}') // 右大括号 { if(bracket[sp]!= '{') { flag = 0; break; } sp--; } } if(flag && sp == -1) // flag==1且栈为空才匹配成功 printf("yes\n"); else printf("no\n"); } }