Problem Description
给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
Input
输入数据有多组,处理到文件结束。
Output
如果匹配就输出“yes”,不匹配输出“no”
Sample Input
sin(20+10) {[}]
Sample Output
yes no
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define stackmax 10000
#define stacknum 10000
typedef int Elemtype;
typedef struct
{
Elemtype *base;
Elemtype *top;
int stacksize;
}Sqstack;
void Initstack(Sqstack *S)
{
S->base=(Elemtype *)malloc(stackmax*sizeof(Elemtype));
if(!S->base) exit(0);
S->top=S->base;
S->stacksize=stackmax;
}//栈的初始化
void Push(Sqstack *S,char n)
{
if(S->top-S->base>=S->stacksize)
{
S->base=(Elemtype *)realloc(S->base,(S->stacksize+stacknum)*sizeof(Elemtype));
if(!S->base) exit(0);
S->top=S->base+S->stacksize;
S->stacksize=S->stacksize+stacknum;
}
*(S->top)=n;//栈顶元素先赋值
S->top++;//栈顶指针加一,栈顶指针上移
}//入栈操作
char Pop(Sqstack *S)
{
char e;
if(S->top==S->base) return -1;
e=*(S->top-1);
S->top--;
return e;
}//出栈操作
int Empty(Sqstack *S)
{
if(S->base==S->top) return -1;
else return 1;
}//判空操作
int GetTop(Sqstack *S)
{
if(S->top==S->base) return -1;
else return *(S->top-1);
}//取栈顶元素
int main()
{
char a[51],ch;
int i,len,flag;
Sqstack S;
while(gets(a)!=NULL)
{
flag=1;//定义指示变量
Initstack(&S);
len=strlen(a);
for(i=0;i<=len-1;i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='{') Push(&S,a[i]);//如果是左半边的括号,则压入栈中,便于之后的比较
else if(a[i]==')')
{
if(Empty(&S)==-1)
{
flag=0;break;
}//如果栈已为空,能不能匹配,指示变量置为0
ch=Pop(&S);
if(ch!='(')
{
flag=0;
break;
}//弹出栈顶指针,看括号是否匹配,若不匹配,则指示变量置为0
}
else if(a[i]==']')
{
if(Empty(&S)==-1)
{
flag=0;break;
}
ch=Pop(&S);
if(ch!='[')
{
flag=0;
break;
}
}//同上
else if(a[i]=='}')
{
if(Empty(&S)==-1)
{
flag=0;break;
}
ch=Pop(&S);
if(ch!='{')
{
flag=0;
break;
}
}//同上
}
if(GetTop(&S)!=-1) flag=0;//若右括号已经没有了,但是左括号还有,说明括号不匹配,指示变量置为0
if(flag==1) printf("yes\n");
else printf("no\n");
}
return 0;
}