一个动态的栈实现的括号匹配程序

# include "stdio.h"
# include "stdlib.h"
# include "string.h"
typedef struct _tegstackitem
{
 char param;
 int  index;
}Sitem,*pSitem;
typedef struct _tegstack
{
 pSitem pItem;
 struct _tegstack *after;
}Stack,*pStack;
int IsNULL(pStack pTop)//测试栈是否为空
{
 if (pTop==NULL)
 {
  return 1;
 }
 return 0;
}
int  push(pStack* pTop,pSitem pItem)//入栈打操作
{
 if (pTop==NULL)
 {
  *pTop=(pStack)malloc(sizeof(Stack));
  if (*pTop==NULL)
  {
   printf("push first error!!!/n");
   return 0;
  }
  (*pTop)->pItem=pItem;
  (*pTop)->after=NULL;
  return 1;
 }
 else
 {
  pStack point=(pStack)malloc(sizeof(Stack));
  if (point==NULL)
  {
   printf("push   error!!!/n");
   return 0;
  }
  point->pItem=pItem;
  point->after=*pTop;
  *pTop=point;
  return 1;
 }
}
int   pop(pStack *pTop,pSitem *pItem)//出栈操作
{
 if (*pTop==NULL)
 {
  return 0;
 }
 *pItem=(*pTop)->pItem;
 pStack point=*pTop;
 *pTop=(*pTop)->after;
 free(point);
 return  1;
}
int getTopItem(pStack pTop,pSitem *pItem)//获得栈顶项
{
 if (pTop->pItem==NULL)
 {
  return 0;
 }
 else
 {
  *pItem=pTop->pItem;
  return 1;
 }
 
}
void main( int argc, char *argv[ ], char *envp[ ] )
{
 if (argv[1]==NULL)
 {
  printf("input param!!!/n");
  return;
 }
 
 int length=strlen(argv[1]);
 char * pStr=(char*)malloc(length);
 if (pStr==NULL)
 {
  printf("memery matching error!!!");
  return;
 }
 memcpy(pStr,argv[1],length);
 int san=0;
 pSitem pItem=NULL;
 pStack pTop=NULL;
 short  flag=0;
 char item1,item2;
 while(san<length)
 {
  item1=*(pStr+san);
  switch(item1)
  {
  case '(':
   flag=1;
   break;
  case '[':
   flag=1;
   break;
  case '<':
   flag=1;
   break;
  case '{':
   flag=1;
   break;
  default:
   flag=0;
      break;
  }
  if (flag)
  {
   pItem=(pSitem)malloc(sizeof(Sitem));
   pItem->index=san;
   pItem->param=item1;
   if (!push(&pTop,pItem)||pTop==NULL)
   {
    printf("push error!!!/n");
    exit(1);
   }
   flag=0;
   san++;
   continue;//返回执行下一次循环
  }
//
  switch(item1)
  {
  case ')':
   item2='(';
   flag=1;
   break;
  case ']':
   item2='[';
   flag=1;
   break;
  case '>':
   item2='<';
   flag=1;
   break;
  case '}':
   item2='{';
   flag=1;
   break;
  default:
   flag=0;
      break;
  }
  if (flag)
  {
   if(!IsNULL(pTop))
   {
    if (!pop(&pTop,&pItem))
    {
     printf("find no matching symbol!/n index(---%d)/n/n",san);
     break;
    }
    if (pItem->param==item2)
    {
     printf("find matching symbol!/n index(%d---%d)/n/n",pItem->index,san);
     free(pItem);
    }
    else
    {
     printf("find no matching symbol!/n index(%d---%d)/n/n",pItem->index,san);
     free(pItem);
     break;
    }
   }
   else
   {
    printf("first symbol no matching !%d/n",san);
     break;
   }
   flag=0;
  }
  san++;
 }
 /
 while (!IsNULL(pTop))//为了收回占用的内存防止内存泄漏
 {
  if (san==length)
  {
    pop(&pTop,&pItem);
    printf("<%d>/"%c/" symbol no matching !/n",pItem->index,pItem->param);
    free(pItem);
  }
  else
  {
    pop(&pTop,&pItem);
    free(pItem);
  }
 }
 /

 free(pStr);
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值