给定一个长度为n的字符串s,字符串由(,),[,]组成,问s是不是一个合法的括号序列
合法的括号序列定义是:
空串是一个合法的括号序列
若A是一个合法的括号序列,则(A),[A]也是合法的括号序列
若A,B都是合法的括号序列,则AB也是合法的括号序列
输入格式
第一行一个整数n
接下来一行一个长度为n的字符串
输出格式
如果s是合法的括号序列,输出Yes,否则输出No
样例输入
10
[]([(())])
样例输出
Yes
int main()
{
int n, s[100001], top = 0;
char str[100011];
scanf("%d%s", &n, str + 1);
for(int i = 1;i<=n;i++)
{
if(str[i]=='(')
{
s[++top] = 0;
}
else if(str[i] == '[')
{
s[++top] = 1;
}
else
{
if(!top)//如果是一个右括号,栈顶是空的
{
printf("No\n");
return 0;
}
if(str[i]==')')
{
if(!s[top])//s[top]=0为'('则与')'匹配,删除掉'(',即栈顶减一
{
--top;
}
else
{
printf("No\n");
return 0;
}
}
else //str[i]==']'
{
if(s[top])//s[top]=1为'['则与']'匹配,删除掉'[',即栈顶减一
{
--top;
}
else//
{
printf("No\n");
return 0;
}
}
}
}
if (top)//当所有的都循环完,如果数组里面非空,则表示并没有匹配完,还有剩余的,则也输出No
{
printf("No\n");
}
else
{
printf("Yes\n");
}
return 0;
}