设字符串仅由圆括号“(”和“)”,方括号“[”和“]”,花括号“{”和“}”组成,利用链栈的操作编写一个检查括号是否正确配对的算法:int Matcher(LstackTP *ls)。例如[{{()}[ ]}(){[ ]}]是正确的,而{({()[ ]})}])}则不正确。设链栈定义如下:(6分)
typedef struct node
{ char data;
struct node * next;
} LStackTp;
//
Stack.cpp : Defines the entry point for the console application.
//
#include " stdafx.h "
#include " stdlib.h "
typedef struct node
{
char data;
struct node * next;
}LStackTp;
void InitStack(LStackTp **ls)
{
*ls=NULL;
}
void Push(LStackTp **ls, char x)
{
LStackTp *p;
p=(LStackTp *)malloc( sizeof(LStackTp));
p->data=x;
p->next=*ls;
*ls=p;
}
int Pop(LStackTp **ls, char *x)
{
LStackTp *p;
if (*ls!=NULL)
{
p=*ls;
*x=p->data;
*ls=p->next;
free(p);
return 1;
}
return 0;
}
int EmptyStack(LStackTp *ls)
{
return (ls==NULL);
}
char GetStackTop(LStackTp *ls)
{
if (ls)
return ls->data;
else
return ' \0 ';
}
void PrintStack(LStackTp **ls)
{
LStackTp *p;
p=*ls;
while (p)
{
printf( " %c \n ",p->data);
p=p->next;
}
}
int MyMatcher( char ch1, char ch2)
{
if ((ch1== ' ( ') && (ch2== ' ) ')) return 1;
if ((ch1== ' [ ') && (ch2== ' ] ')) return 1;
if ((ch1== ' { ') && (ch2== ' } ')) return 1;
return 0;
}
int Matcher(LStackTp **ls, char *p)
{
char ch;
char *x=&ch;
while (*p)
{
if ( MyMatcher(GetStackTop(*ls),(*p) ))
{
Pop(ls,x);
}
else
{
Push(ls,*p);
}
p++;
}
return EmptyStack(*ls);
}
int main( int argc, char* argv[])
{
LStackTp *S;
InitStack(&S);
char *p= " (()){}[]{{}({})}({[()]}) ";
if (Matcher(&S,p))
printf( " 这是一个合法的括号序列! ");
else
printf( " 这是一个不合法的括号序列! ");
printf( " \n\n\n\n\n ");
return 0;
//
#include " stdafx.h "
#include " stdlib.h "
typedef struct node
{
char data;
struct node * next;
}LStackTp;
void InitStack(LStackTp **ls)
{
*ls=NULL;
}
void Push(LStackTp **ls, char x)
{
LStackTp *p;
p=(LStackTp *)malloc( sizeof(LStackTp));
p->data=x;
p->next=*ls;
*ls=p;
}
int Pop(LStackTp **ls, char *x)
{
LStackTp *p;
if (*ls!=NULL)
{
p=*ls;
*x=p->data;
*ls=p->next;
free(p);
return 1;
}
return 0;
}
int EmptyStack(LStackTp *ls)
{
return (ls==NULL);
}
char GetStackTop(LStackTp *ls)
{
if (ls)
return ls->data;
else
return ' \0 ';
}
void PrintStack(LStackTp **ls)
{
LStackTp *p;
p=*ls;
while (p)
{
printf( " %c \n ",p->data);
p=p->next;
}
}
int MyMatcher( char ch1, char ch2)
{
if ((ch1== ' ( ') && (ch2== ' ) ')) return 1;
if ((ch1== ' [ ') && (ch2== ' ] ')) return 1;
if ((ch1== ' { ') && (ch2== ' } ')) return 1;
return 0;
}
int Matcher(LStackTp **ls, char *p)
{
char ch;
char *x=&ch;
while (*p)
{
if ( MyMatcher(GetStackTop(*ls),(*p) ))
{
Pop(ls,x);
}
else
{
Push(ls,*p);
}
p++;
}
return EmptyStack(*ls);
}
int main( int argc, char* argv[])
{
LStackTp *S;
InitStack(&S);
char *p= " (()){}[]{{}({})}({[()]}) ";
if (Matcher(&S,p))
printf( " 这是一个合法的括号序列! ");
else
printf( " 这是一个不合法的括号序列! ");
printf( " \n\n\n\n\n ");
return 0;
}