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");
    }
}