
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct stack
{
datatype* a;
int top;
int capacity;
}ST;
void stackinit(ST* ps)
{
ps->a = (datatype*)malloc(sizeof(datatype) * 4);
ps->capacity = 4;
ps->top = 0;
}
void stackdestory(ST* ps)
{
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
void stackpush(ST* ps, datatype x)
{
if (ps->capacity == ps->top)
{
datatype* tmp = (datatype*)realloc(ps->a, sizeof(datatype) * ps->capacity * 2);
if (tmp == NULL) exit(-1);
else {
ps->a = tmp;
ps->capacity *= 2;
}
}
ps->a[ps->top] = x;
ps->top++;
}
void stackpop(ST* ps)
{
ps->top--;
}
datatype stacktop(ST* ps)
{
return ps->a[ps->top - 1];
}
int stacksize(ST* ps)
{
return ps->capacity;
}
bool stackempty(ST* ps)
{
return ps->top == 0;
}
bool isvaild(char* s)
{
ST st;
stackinit(&st);
while (*s != '\0')
{
switch (*s)
{
case '(':
case '[':
stackpush(&st, *s);
s++;
break;
case ')':
case ']':
if (stackempty(&st))
{
stackdestory(&st);
return false;
}
char top = stacktop(&st);
stackpop(&st);
if ((*s == ')' && top != '(') || (*s == ']' && top != '['))
{
stackdestory(&st);
return false;
}
else s++;
}
}
bool ret = stackempty(&st);
stackdestory(&st);
return ret;
}
int main()
{
char arr[1000];
scanf("%s", arr);
if (isvaild(arr))printf("YES");
else printf("NO");
return 0;
}