#include<stdio.h>
#include<stdlib.h>
#define size 50
typedef struct
{
char data[size];
int top;//存放栈顶元素的下标
}stack;//栈的定义,栈是后进先出,出进栈是同一个口
void initstack(stack *s){
s->top=-1;
}//初始化栈为空栈
int push(stack *s,char n){
if(s->top==size-1){
return 0;//栈已满
}
s->top++;
s->data[s->top]=n;
return 1;
} //顺序进栈
int IsEmpty(stack s){
if(s.top==-1){
return 1;
}
return 0;
}
int check(char a,char b){
if (a == '(' && b == ')') {
return 1;
} else if (a == '[' && b == ']') {
return 1;
} else if (a == '{' && b == '}') {
return 1;
} else {
return 0;
}
}//判断是否是一对括号
int pop(stack *s,char *c){
if(s->top==-1){
return 0;
}
else{
*c=s->data[s->top];
s->top--;
return 1;
}
}//出栈,将栈顶元素放入c中
int gettop(stack *s,char *c){
if(s->top==-1){
return 0;
}
else{
*c=s->data[s->top];
return 1;
}
} //取出栈顶的值,将其放在c里面
int main(){
stack s;
initstack(&s);
char c,ch;
while(1){
scanf("%c",&c);
if(c=='\n'){
break;
}
switch(c)
{ case '(':
case '[':
case '{':
push(&s,c);break;
case ')':
case '}':
case ']':
if(IsEmpty(s)){
printf("no\n");
return 0;
}//如果在输入右括号时,栈内已空则说明,右括号多余也输出no
else{
gettop(&s,&ch);//取出栈顶的值,然后放在c里面
if(check(ch,c)) {//将栈顶的值与新读入的右括号相匹配
pop(&s,&ch);//如果匹配则将栈顶元素取出
}
else {
printf("no\n");//如果不匹配则输出no
return 0;
}
}
}/*Switch*/
}
if(IsEmpty(s)){
printf("yes\n");
}
else {
printf("no\n");
}//将所有的都匹配完成后若栈内为空则说明成功
return 0;
}