一個動態棧實現的括弧匹配程式

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.