• 关于括号匹配问题!


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

    #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;
    }

  • 相关阅读:
    [转]使用RDLC报表
    WPF 导出Excel 导出图片
    细说WPF自定义路由事件
    [转]WPF更换主题
    推荐5款超实用的.NET性能分析工具
    Hibernate框架
    C#的protected internal
    C#的类修饰符和成员修饰符
    C#的foreach
    C#接口
  • 原文地址:https://www.cnblogs.com/wdc123/p/3394547.html
Copyright © 2020-2023  润新知