#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct Lsnode{
ElemType data;
struct Lsnode *next;
}Lsnode;
Lsnode *top;
void initstack(Lsnode *top){//初始化空表
top->next = NULL;
}
int isEmpty(Lsnode top){//判断是否为空表
if(top.next == NULL) return 1;
return 0;
}
void push(Lsnode *top,ElemType x){//入栈
Lsnode *p;
p = (Lsnode*)malloc(sizeof(Lsnode));
p->data = x;
p->next = top->next;
top->next = p;
}
ElemType pop(Lsnode *top){//出栈
ElemType x;
Lsnode *p;
if(top->next != NULL)
{
p = top->next;
top->next = p->next;
x = p->data;
free(p);
return x;
}
else
{
printf("Stack null!\n");
return '#';
}
}
int main()
{
Lsnode s;
ElemType x,r;
initstack(&s);
while(~scanf("%c",&x))
{
if(x == '\n'){break;}//换行就结束输入
if(x == '('||x == '['||x == '{')//如果是左括号就入栈
{
push(&s,x);
}
if(x == ')'||x == ']'||x == '}')//如果是右括号就把最近的一个括号提取出来比较
{
if(isEmpty(s)!=1)//防止一开始就是右括号
{
r = pop(&s);//出栈
}
else
{
push(&s,'#');//如果出现该情况直接返回NO
}
if(x == ')'&&r == '('||x == ']'&&r == '['||x == '}'&&r == '{')//如果是匹配的括号就继续
{
continue;
}
else//一次匹配失败直接退出
{
push(&s,r);
break;
}
}
}
if(isEmpty(s))//如果是空栈,则说明括符匹配成功。
{
printf("Yes");
}
else
{
printf("no");
}
}