wxs的括号序列
题目描述
美好的事物都是成对出现的,当然括号也是!WXS最近迷上了括号序列,但是这次的括号序列不同,它不仅仅有 '( '和 ')'还有 ‘{’ ‘}’。HJ说 如果每个左括号 都能和它右边的右括号匹配成功,那么它就是一个完美的括号序列。人尽皆知小括号是不能包住大括号的 ( ** ({}) 这样就是错的**).
分析: 这个题用栈就比较简单了。
#include"stdio.h"
#include"math.h"
void PUSH(char *stack,int *top,char c)//入栈
{
(*top)++;
*(stack+*top)=c;
}
char POP(char *stack,int *top)//压栈并返回栈顶的值
{
char c=*(stack+*top);
(*top)--;
return c;
}
int main()
{
char stack[10000],a[10000],cc;
int i,top,t;
while(~scanf("%s",&a[1]))//一个数组直接输入字符串
{
i=1;
top=0;
t=0;
while(a[i]!='\0')
{
if(a[i]=='{'&&t==0)//等于’{‘,就入栈,且t==0.因为t如果不为0,则表示前面有’(‘。
PUSH(stack,&top,a[i]);
if(a[i]=='(')//小括号入栈,t可为任意值
{
PUSH(stack,&top,a[i]);
t++;//t++记录有多少个这样的小括号’(‘
}
if(a[i]=='{'&&t!=0)//若为’{‘了,且t不等于0。则不满足条件直接退出
{
break;
}
if(a[i]==')'&&t!=0)
{
cc=POP(stack,&top);
if(!(cc=='('))
break;
t--;
}
if(a[i]=='}'&&t==0)
{
cc=POP(stack,&top);
if(!(cc=='{'))
break;
}
i++;
}
if(top==0)
printf("YES\n");
else
printf("NO\n");
}
}