括弧マッチングアルゴリズム
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);
}
, , ,
, , !