zoukankan      html  css  js  c++  java
  • 关于括号匹配问题!

    /*
     括号匹配问题。
     思想:括号分为(,[,],)四种。当遇见左括号时将其压入栈,当遇见右括号时有两种情况。
    第一种是该右括号与栈顶的括号想匹配。第二种是该括号不合法,就是括号不匹配。开始时,
    栈为空,当一对括号发生匹配时,将左括号取出。所以结束时,栈也为空。
    */

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define InitSize 100  //定义初始存储空间大小
    #define Size 100  //定义新增存储空间的大小
    #define MAX 100
    //定义结构体
    typedef struct Stack
    {
     int* top;
     int* base;
     int stacksize;
    }SqStack;

    //建立一个空栈
    void InitStack(SqStack *s)
    {
     s->base = (int *)malloc(InitSize * sizeof(int));
     if(!s->base) printf("分配失败! ");
     s->top = s->base;
     s->stacksize = InitSize;
    }

    //入栈
    void Push(SqStack *s, int e)
    {
     if(s->top - s->base >= s->stacksize)
     {
      s->base = (int *) realloc (s->base, (s->stacksize+Size)*sizeof(int));
      s->top = s->base + s->stacksize;
      s->stacksize += Size;
     }
     *(s->top) = e;
     s->top++;
    }

    //取栈顶元素
    int getTop(SqStack *s)
    {
     int e;
     if(s->base == s->top)
     {
      return 0;
     }
     e = *(s->top-1);
     return e;
    }

    //删除栈顶元素
    int Pop(SqStack *s)
    {
     //int e;
     if(s->top == s->base)
     {
      return 0;
     }
     s->top --;
     //e = *(--s->top);
     //return e;
    }

    int main()
    {
     //使用字符数组来定义字符串,用strlen来求字符串的长度
     char str[MAX];
     int i, e;
     SqStack s;  //定义结构体变量
     printf("请输入要检测的括号对:");
     scanf("%s", str);
     
     InitStack(&s);
     
     for(i=0; i<strlen(str); i++)
     {
      if(str[0] ==')' || str[0]==']')
      {
       printf("括号不匹配!");
       break;
      }
      if(str[i] == '(' ||str[i] == '[') Push(&s,str[i]);
      else if(str[i] ==')' || str[i]==']')
      {
       e = getTop(&s);
       //printf("%c", e);
       if(e != 0)
       {
        if(e == '(' && str[i] ==')')
        {
         Pop(&s);
        }
        else if(e == '[' && str[i] ==']')
        {
         Pop(&s);
        }
        else
        {
         printf("括号不匹配! ");
         break;
        }
       }
      }
      else
      {
       printf("输入错误!");
       break;
      }
     }
     //printf("%d,%d", i,strlen(str)-1);
     //这里i的值,要分清for循环执行完后,i的值。
     if(getTop(&s)==0 && i==strlen(str) && i) printf("括号匹配! ");
     return 0;
    }

  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/wdc123/p/3394547.html
Copyright © 2011-2022 走看看