Problem Description
Input
Output
Example Input
sin(20+10){[}]
Example Output
yesno
Hint
Author
ma6174
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INIT_STACK_SIZE 100000 //栈的初始分配量
#define stackincrement 1000 //栈的初始分配增量
typedef int element;
typedef struct
{
element *base,*top;
int stacksize;
}Sqstack;
int Initstack(Sqstack *s)
{
s->base=(element *)malloc(INIT_STACK_SIZE*sizeof(element));
if(!s->base) return -1;
s->top=s->base;
s->stacksize=INIT_STACK_SIZE;
return 0;
}
int clearstack(Sqstack *s) //清空函数,每次处理完一组数据后,要清空栈;
{
s->top=s->base;
return 0;
}
int Pushstack(Sqstack *s,int n)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(element *)realloc(s->base,(INIT_STACK_SIZE+stackincrement)*sizeof(element ));
if(!s->base) return -1;
s->top=s->base + s->stacksize;
s->stacksize+=INIT_STACK_SIZE;
}
*(s->top++)=n;
return 0;
}
int Popstack(Sqstack *s)
{
if(s->base==s->top) return -1;
--s->top;
return 0;
}
void pipei(Sqstack *s)
{
int flag;
char ch[52];int i;
while(gets(ch))
{
flag=1;
for(i=0;i<strlen(ch);i++)
{
if(ch[i]=='('||ch[i]=='['||ch[i]=='{') //如果遇到左括号时,使左括号进栈
Pushstack(s,ch[i]);
else if(ch[i]==')'||ch[i]==']'||ch[i]=='}') //当遇到右括号时,判断栈顶元素是否与其匹配,如果不匹配,则结束;否则栈顶元素出栈
{
if((ch[i]==')'&&*(s->top-1)=='(')||(ch[i]=='}'&&*(s->top-1)=='{')||(ch[i]==']'&&*(s->top-1)=='['))
Popstack(s);
else
{
flag=0;
break;
}
}
}
if(flag==1&&(s->base==s->top))
printf("yes\n");
else
printf("no\n");
clearstack(s); //清空栈
}
}
int main()
{
Sqstack s;
Initstack(&s);
pipei(&s);
return 0;
}