利用栈来实现括号匹配
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
typedef char ElemType;
typedef struct Link{
ElemType data;
struct Link*next;
}LinkStNode;
void InitStack(LinkStNode*&L)
{
L=(LinkStNode*)malloc(sizeof(LinkStNode));
L->next=NULL;
}
void Destory(LinkStNode* &s)
{
LinkStNode*pre=s,*p=s->next;
while(p)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool StackEmpty(LinkStNode*s)
{
return (s->next==NULL);
}
void Push(LinkStNode * &s,char e)
{
LinkStNode*p;
p=(LinkStNode*)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
}
bool Pop(LinkStNode*&s,ElemType &e)
{
LinkStNode*p;
if(s->next==NULL)
{
return false;
}
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
bool GetTop(LinkStNode*s,ElemType&e)
{
if(s->next==NULL)
{
return false;
}
e=s->next->data;
return true;
}
bool match(char s[],int n)
{
int i=0;char e;
bool match=true;
LinkStNode*st;
InitStack(st);
while(i<n&&match)
{
if(s[i]=='I')
Push(st,s[i]);
else if(s[i]=='O')
{
if(GetTop(st,e)==true)
{
if(e!='I')
match=false;
else
Pop(st,e);
}
else match=false;
}
i++;
}
if(!StackEmpty(st))
{
match=false;
}
Destory(st);
return match;
}
int main()
{
char s[20];
int n;
scanf("%s",s);
n=strlen(s);
int p=match(s,n);
if(p==1)
{
printf("匹配");
}
else
printf("不匹配");
return 0;
}