http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2134
数据结构实验之栈四:括号匹配
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入
输入数据有多组,处理到文件结束。
输出
如果匹配就输出“yes”,不匹配输出“no”
示例输入
sin(20+10){[}]
示例输出
yesno
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 1000
typedef char selement;
typedef struct
{
selement *top;
selement *base;
int stacksize;
}st;
int creat(st &S)
{
S.base=(selement *)malloc(maxsize*sizeof(selement));
if(!S.base) exit(0);
S.top=S.base;
S.stacksize=maxsize;
return 1;
}
int push(st &S,selement e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(selement *)realloc(S.base,
(maxsize+S.stacksize)*sizeof(selement));
if(!S.base) exit(0);
S.top=S.base+S.stacksize;
S.stacksize+=maxsize;
}
*(S.top++)=e;
return 1;
}
int pop(st &S,selement &e)
{
if(S.top==S.base)
return 0;
e=*(--S.top);
return 1;
}
int func(st &S,char ch)
{
int flag=1;
char e;
if(ch=='('||ch=='['||ch=='{')
push(S,ch);
else if(ch==')')
{
if(pop(S,e)==0)
flag=0;
if(e!='(')
flag=0;
}
else if(ch==']')
{
if(pop(S,e)==0)
flag=0;
if(e!='[')
flag=0;
}
else if(ch=='}')
{
if(pop(S,e)==0)
flag=0;
if(e!='{')
flag=0;
}
return flag;
}
int main()
{
int i,flag;
char ch[250];
st S;
while(gets(ch)!=NULL)
{
flag=0;
creat(S);
if(ch[0]=='\0')
continue;
for(i=0;ch[i]!='\0';i++)
{
flag=func(S,ch[i]);
if(flag==0)
break;
}
if(flag==1&&S.top==S.base)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 1000
typedef char selement;
typedef struct
{
selement *top;
selement *base;
int stacksize;
}st;
int creat(st &S)
{
S.base=(selement *)malloc(maxsize*sizeof(selement));
if(!S.base) exit(0);
S.top=S.base;
S.stacksize=maxsize;
return 1;
}
int push(st &S,selement e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(selement *)realloc(S.base,
(maxsize+S.stacksize)*sizeof(selement));
if(!S.base) exit(0);
S.top=S.base+S.stacksize;
S.stacksize+=maxsize;
}
*(S.top++)=e;
return 1;
}
int pop(st &S,selement &e)
{
if(S.top==S.base)
return 0;
e=*(--S.top);
return 1;
}
int func(st &S,char ch)
{
int flag=1;
char e;
if(ch=='('||ch=='['||ch=='{')
push(S,ch);
else if(ch==')')
{
if(pop(S,e)==0)
flag=0;
if(e!='(')
flag=0;
}
else if(ch==']')
{
if(pop(S,e)==0)
flag=0;
if(e!='[')
flag=0;
}
else if(ch=='}')
{
if(pop(S,e)==0)
flag=0;
if(e!='{')
flag=0;
}
return flag;
}
int main()
{
int i,flag;
char ch[250];
st S;
while(gets(ch)!=NULL)
{
flag=0;
creat(S);
if(ch[0]=='\0')
continue;
for(i=0;ch[i]!='\0';i++)
{
flag=func(S,ch[i]);
if(flag==0)
break;
}
if(flag==1&&S.top==S.base)
printf("yes\n");
else
printf("no\n");
}
return 0;
}