关于用栈解决ACM括号配对问题

来源:互联网 发布:在线抓阄软件 编辑:程序博客网 时间:2024/06/05 04:32

关于括号配对问题:

解题思路:

1)采用顺序栈先把接收字符串,然后从字符串第一个开始入栈,当遇到‘(’‘【’‘{’这三种括号时入栈

2)当遇到另外三边括号时,依次把栈顶元素弹出与之配对,是否配对,不配对设置标志位为0

3)依次配对,空栈配对失败,最后顺利遍历完所有的元素,并且标志位没有改变,那就说明是配对打印出yes

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3[(])(])([[]()])
样例输出
NoNoYes

代码如下:

    #include <stdio.h>
    #include <stdbool.h>
    #include<string.h>
    #define LISTSIZE 100
    #define la '('
    #define ra ')'
    #define lz '['
    #define rz ']'
    typedef char DataType;
    typedef struct Stack {
        DataType data[LISTSIZE];
        int top; //处了记录大小  还可以记录栈顶位置
    }ST;
    void init(ST* stack)
    {
        stack->top = 0;
    }
    bool empty(ST* stack) {
        return stack->top == 0;
    }
    void push(ST* stack, DataType *d) {
        if (stack->top == LISTSIZE)
            return;
       strcpy(&stack->data[stack->top++],d);
    }
    void pop(ST* stack) {
        if (empty(stack))
            return;
        stack->top--;
    }
    DataType topstack(ST* stack) {
        return stack->data[stack->top - 1];
    }

    int main()
    {
        int i=0,len=0,G=0;
        ST stack;
        //init(&stack);
        bool flag;
        char  str[100];
      printf("input groups N\n");
      scanf("%d",&G);
      while(G--)
     {        
         flag=1;
         scanf("%s",str);
         len=strlen(str);
         init(&stack);
        for(i=0;i<len;i++)
        {
           if(str[i]=='('||str[i]=='['||str[i]=='{')
           {
             push(&stack,&str[i]);
           }
         else if(str[i]==')')
          {
          if(empty(&stack)!=0||topstack(&stack)!='(')flag=0;
           pop(&stack);
          }
         else if(str[i]==']')
          {
        if(empty(&stack)!=0||topstack(&stack)!='[')flag=0;
           pop(&stack);
          }
          else if(str[i]=='}')
          {
          if(empty(&stack)!=0||topstack(&stack)!='{')flag=0;
           pop(&stack);
          }
        }
        if(empty(&stack)==0)flag=0;
        if(flag)printf("yes!!\n");
        else printf("NO!!");
}
        return 0;
        }


0 0
原创粉丝点击