/*Sample Input
sin(20+10)
{[}]
Sample Output
yes
no*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int status;
typedef char elemtype;
elemtype str[100];
typedef struct node{
elemtype *base;
elemtype *top;
int size;
}sqstack;
status initstack(sqstack &s){//初始化栈
s.base=(elemtype *)malloc(LIST_INIT_SIZE*sizeof(elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base;
s.size=LIST_INIT_SIZE;
return OK;
}
status get_top(sqstack s,elemtype &e){//获得栈顶元素
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return OK;
}
status push(sqstack &s,elemtype e){//向栈中输入元素
if(s.top-s.base>=s.size){
s.base=(elemtype *)realloc(s.base,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.size;
s.size+=LISTINCREMENT;
}
*s.top++=e;
return OK;
}
status pop(sqstack &s,elemtype &e){//删除栈顶元素
if(s.top==s.base)
return ERROR;
e=*--s.top;
return OK;
}
status empty(sqstack &s){//判断栈是否为空
if(s.base==s.top)
return TRUE;
else
return FALSE;
}
int getlenght(char str1[]){
int cnt=0;
for(int i=0;str1[i];i++){
cnt++;
}
return cnt;
}
int main(){
while(gets(str)){
int len=getlenght(str);
sqstack s;
initstack(s);
elemtype e;
int flag=0;
for(int i=0;i<len;i++){
if(flag)
break;
if(str[i]=='('||str[i]=='{'||str[i]=='['){
e=str[i];
push(s,e);
}
else if(str[i]==')'||str[i]=='}'||str[i]==']'){
if(empty(s)){
flag=1;
break;
}
pop(s,e);
if((str[i]==')'&&e=='(')||(str[i]=='}'&&e=='{')||(str[i]==']'&&e=='['))
{
continue;
}
else{
flag=1;
break;
}
}
else continue;
}
if(flag==1||!empty(s))
printf("no\n");
else
printf("yes\n");
}
return 0;
}