#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 200
typedef struct node
{
char data[maxn];
int top;
}Stack;
void origin(Stack *&s)
{
s=(Stack *)malloc(sizeof(Stack));//初始化;
s->top=-1;//先将栈顶置为-1,后面需要进行++操作;
}
void push(Stack *&s,char str)
{
if(s->top==maxn) exit(0);
/*
exit(1)表示异常退出.这个1是返回给操作系统的;
exit(x)(x不为0)都表示异常退出;
exit(0)表示正常退出;
*/
s->top++;
s->data[s->top]=str;//入栈;
}
char pop(Stack *&s,char str)
{
if(s->top==-1) exit(0);//栈中没有元素,正常退出;
str=s->data[s->top];//删除栈中当前的值;
s->top--;
return str;
}
int Left_Mark(char str)
{
if(str=='(' || str=='[' || str=='{') return 1;
else return 0;
}
int Right_Mark(char str)
{
if(str==')' || str==']' || str=='}') return 1;
else return 0;
}
int judge(char str1,char str2)
{
if((str1=='(' && str2==')') || (str1=='[' && str2==']') || (str1=='{' && str2=='}'))
return 1;
else return 0;
}
int main()
{
Stack *s;//从栈中实例化一个对象;
origin(s);//将实例化的对象调用并且初始化;
char str[1005];//致以我对str深沉的爱;
while(cin>>str)
{
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(Left_Mark(str[i])==1) push(s,str[i]);
else if(Right_Mark(str[i])==1)
{
if(s->top==-1)//栈为空,无法与之匹配;
{
cout<<"NO";
exit(0);
}
char e;
e=pop(s,e);
if(judge(e,str[i])==0)//将之前栈里的最后一个元素出列,和新入的右括号比对
{
cout<<"NO";
exit(0);
}
}
}
if(s->top!=-1) cout<<"NO";//栈中有元素没有用完;
else cout<<"YES";
}
return 0;
}