栈
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");
}
}
京公网安备 11010502036488号