#include
#include
#define OK 10000001
#define ERROR 10000002
struct note//定义栈结点
{
int data;
note* next;
};
typedef struct note Note;//给栈节点换个名字
struct stack//定义栈头节点
{
int count;
note* top;
};
typedef struct stack Stack;//给栈换个名字
int InitStack(Stack *s)//初始化栈
{
s->top = NULL;
s->count = 0;
return OK;
}
int push(Stack *s, int t)//入栈
{
Note *p = (Note*)malloc(sizeof(Note));
if (p == NULL)
{
return ERROR;
}
p->data = t;
p->next = s->top;
s->top = p;
s->count++;
return OK;
}
int GetTop(Stack *s)//返回栈顶元素
{
if (s->count == 0)
return ERROR;
return s->top->data;
}
int pop(Stack *s)//出栈
{
if (s->count == 0)
return ERROR;
int e;
Note *p = s->top;
e = p->data;
s->top = p->next;
free(p);
s->count--;
return e;
}
int judge(int e,Stack *s)//判断括号
{
char tmp;
if (e == 1)
tmp = '(';
else if (e == 2)
tmp = '[';
else if (e == 3)
tmp = '{';
if (tmp == GetTop(s))
{
pop(s);
return OK;
}
else return ERROR;
}
int main()
{
char str[102];
Stack sign;
InitStack(&sign);
scanf("%s", str);
int flag=OK;//标志符
for (int i = 0; str[i] != '\0'; ++i)
{
if (str[i] == '{' || str[i] == '[' || str[i] == '(')//是左括号,入栈
push(&sign, str[i]);
else
{
switch (str[i])//是右括号,检查,出栈
{
case ')': flag = judge(1, &sign); break;
case ']': flag = judge(2, &sign); break;
case '}': flag = judge(3, &sign); break;
default:
break;
}
}
if (flag == ERROR)
{
printf("NO");
break;
}
}
if (flag == OK)
printf("YES");
return 0;
}