现在的位置: 首页 > 综合 > 正文

使用堆栈实现括号的匹配

2018年02月03日 ⁄ 综合 ⁄ 共 2629字 ⁄ 字号 评论关闭

#include <string.h>
 #include<stdio.h>
typedef char DataType;
#define  MaxSize 10
typedef struct
{
 DataType stack [MaxSize];
 int top;
}sstack;

//堆栈的初始化
void StackInit(sstack *s)
{
    s->top=0;      //定义指针变量,他指向的变量的成员变量为0;
}               

//插入数据
int StackInsert(sstack*s,DataType x)
{
    if(s->top>MaxSize)
    {
      printf("堆栈已满不能插如");
      return 0;
    }
    else
    {
      s->stack[s->top]=x;
      s->top++;
        return 1;
    }
}

//判断堆栈是否为空
int StackNe(sstack s)
{
    if(s.top<=0)
    {
      return 0;
    }
    else
    {
       return 1;
    }
}
//出栈

int StackDelete(sstack *s,DataType *x)
{
    if(s->top<=0)
    {
      printf("堆栈为空");
      return 0;
    }

    else
    {    s->top--;
        *x=s->stack[s->top];
        return 1;
    }
}

//取出栈顶元素

 int StackGet(sstack s, DataType *x)
 {
     if(s.top<0)
     {
         printf("堆栈为空");
          return 0;
     }
     else
     {        
         *x=s.stack[s.top-1];
         return 1;
     }                                        
 }
 
 //函数实现括号的匹配

 void  pipei(char ele[],int n)
  {      int i;
      sstack  mystack;
      char c;
      //初始化栈
      StackInit(&mystack);
       for(i=0;i<n;i++)
      {
          //如果是左括号则入栈
           if((ele[i]=='{')||(ele[i]=='[')||(ele[i]=='('))  
         {
                StackInsert(&mystack,ele[i]) ;
         }
         //如果是有括号则进行匹配,如果不是空的而且是在栈顶则出栈,说明他们是匹配的。
         else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='(')
         {
           //如果是匹配的则出栈
             StackDelete(&mystack,&c);
             printf("()\t");
         }
         else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='(')
         {
            printf("括号匹配不正确\n");
              return ;

         }


         //[][][][][][]]]]]]]][[[[[[[[[[[[[[]]]]]]]]]]]]][[[[[[[[[[]]]]]

       

         else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='[')

         {
           //如果是匹配的则出栈
             StackDelete(&mystack,&c);
             //printf("括号是匹配的");
             printf("[] \t");
         }
         else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='[')
         {
            printf("括号匹配不正确 \n");
              return ;
         }

         //{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}
         else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='{')
         {
           //如果是匹配的则出栈
             StackDelete(&mystack,&c);
             //printf("括号匹配真确 \n");
             printf("{} \t");
         }
         else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='{')
         {
            printf("括号匹配不正确 \n");
              return ;
         }

         else if((ele[i]==')')||(ele[i]==']')||(ele[i]=='}')&&!StackNe(mystack))
         {
            printf("右括号多于左括号! \n");
         }

      }
      if(StackNe(mystack))
      {
         printf("左括号多于右括号! \n");
      }
       
      else
       {
             printf("括号匹配正确!\n");
       }
  }

 int   main ()
 {        
     char a[]={'{','[','(',')',']','}'} ;
     char b[]={'{','{','[','(',')',']','}'};
     pipei(b,10);
  return 0;
 }

抱歉!评论已关闭.