括弧マッチングアルゴリズム

2634 ワード

#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<malloc.h>
typedef char ElemType;
typedef struct stack
{
 ElemType data;
 struct stack *top;
}LinkStack;
int InitStack(LinkStack *&ls)
{
 ls=NULL;
 return 1;
}
int ClearStack(LinkStack *&ls)
{
 LinkStack *p;
 if(ls==NULL)
  return 0;
 while(ls!=NULL)
 {
  p=ls;
  ls=p->top;
  free(p);
 }
 return 1;
}
int StackEmpty(LinkStack *ls)
{
 if(ls==NULL)
  return 1;
 else return 0;
}
int StackLength(LinkStack *ls)
{
 int i=0;
 LinkStack *p=ls;
 while(p!=NULL)
 {
  p=p->top;
  i++;
 }
 return i;
}
ElemType GetTop(LinkStack *ls)
{
 ElemType e;
 if(ls==NULL)
  return 0;
 e=ls->data;
 return e;
}
int Push(LinkStack *&ls,ElemType e)
{
 LinkStack *p;
    p=new struct stack[sizeof(LinkStack)];
 p->data=e;
 p->top=ls;
 ls=p;
 return 1;
}
int Pop(LinkStack *&ls,ElemType &e)
{
 LinkStack *p;
 if(ls==NULL)
  return 0;
 else 
 {
  p=ls;
  e=p->data;
  ls=p->top;
  free(p);
 }
 return 1;
}
//8.       
void StackPrint(LinkStack *ls)
{
 LinkStack *p=ls;
 if(ls==NULL)
  return ;
 while(p!=NULL)
 {
  
  cout<<p->data<<"   ";
  p=p->top;
 }

}
//9.     ,                。
int huiwen(ElemType str[])
{
 int i=0;
 ElemType ch,temp;
 LinkStack *ls;
 InitStack(ls);
 while((ch=str[i++])!='\0')
  Push(ls,ch);
 i=0;
 while(!StackEmpty(ls))
 {
  Pop(ls,temp);
  if(temp!=str[i++])
   return 0;
 }
 return 1;
}
//10.         ,            , 0      。                。
int Reverse()
{
 
 ElemType ch;
    LinkStack *ls;
 InitStack(ls);
 cout<<"          :";
 cin>>ch;
 while(ch!=48)
 {
  Push(ls,ch);
  cin>>ch;
 }
 while(!StackEmpty(ls))
 {
  Pop(ls,ch);
  cout<<ch<<"   ";
 }
 return 1;
}



//12.            。
int Match(char str[])
{
 int i=0;
 LinkStack *ls;
 InitStack(ls);
 ElemType ch,e;
 while(str[i]!='\0')
 {
  if(str[i]=='('||str[i]=='[')
  {
   Push(ls,str[i]);
   ch=GetTop(ls);
                 }
  else if(ch=='('&&str[i]==')')
  { Pop(ls,e);ch=GetTop(ls);}
  else if(ch=='['&&str[i]==']')
  { Pop(ls,e);ch=GetTop(ls);}
  else 
   return 0;
  i++;
 }
 if(StackEmpty(ls))
  return 1;
 else
  return 0;
}

void main(){
cout<<endl<<"    :"<<endl;
 ElemType str2[]="[[[]()()]]()([])(([]))";
 cout<<Match(str2);
}
                        ,          ,         ,      
        ,              ,      !