故我


私信TA

用户名:uq_37592642929

访问量:2982

签 名:

一起去啊,更远方的地方!!!!

等  级
排  名 706
经  验 3910
参赛次数 0
文章发表 53
年  龄 0
在职情况 学生
学  校 社会大学
专  业

  自我简介:

解题思路:

注意事项:

参考代码:

#include <stdio.h>

#include <string.h>

typedef struct s{

    int top;

    char data[1000];

}STACK;

void clear(STACK *stack){ //初始化栈

    stack->top=-1;

}

void pop(STACK *stack){  //出栈

    stack->top--;

}

void push(STACK *stack,char c){   //入栈

    stack->top++;

    stack->data[stack->top]=c;

}

int compare(char c){   //将四种括号赋于优先级

    if (c=='<'||c=='>'){  

        return 1;

    }else if (c=='('||c==')'){

        return 2;

    }else if (c=='['||c==']'){

        return 3;

    }else{

        return 4;

    }

}

int main (){

    int n,f=0;

    STACK *stack;

    stack=(STACK *)malloc(sizeof(STACK));  //指针创建空间

    scanf ("%d",&n);

    getchar ();

    for (int j=0;j<n;j++){

        clear(stack);

        f=0;   //记录是否输出的标志

        char a[1000]; 

        scanf ("%s",a);

        for (int i=0;a[i]!='\0';i++){

            if (a[i]=='<'||a[i]=='('||a[i]=='['||a[i]=='{'){  //左括号处理

                if (stack->top==-1||compare(stack->data[stack->top])>=compare(a[i])){ //如果栈为空左括号直接入栈或者该括号优先级比栈顶括号小于等于也入栈

                    push(stack,a[i]);

                }else if (compare(stack->data[stack->top])<compare(a[i])){   //如果该括号优先级比栈顶括号优先级高的话,匹配就错误了

                    printf ("NO\n");

                    f=1;   //标志为1,代表输出过答案,后面就不输出

                    break;

                }

            }else if (a[i]=='>'||a[i]==')'||a[i]==']'||a[i]=='}'){  //右括号处理

                if (stack->top==-1){   //如果在输入右括号时,栈为空就永远匹配不上,直接输出NO

                    printf ("NO\n");

                    f=1;   //标志为1,代表输出过答案,后面就不输出

                    break;

                }

                if (compare(stack->data[stack->top])==compare(a[i])){  //该括号优先级等于栈顶括号优先级的话,两括号匹配成功,将栈顶括号出栈即可

                    pop(stack);

                }else{  //该括号优先级不等于栈顶括号优先级的话,两括号匹配失败,直接输出NO

                    printf ("NO\n");

                    f=1;    //标志为1,代表输出过答案,后面就不输出

                    break;

                }

            }

        }

        if (f==0&&stack->top==-1){   //如果最后栈为空了,代表全部匹配上了,并且f==0,无输出,则全部成功,输出YES

            printf ("YES\n");

        }else if (f==0&&stack->top!=-1){   //如果最后栈不为空了,代表没有全部匹配上,并且f==0,无输出,则匹配失败,输出NO

            printf ("NO\n");

        }

        

    }

}


 

0.0分

1 人评分

  评论区

  • «
  • »