思路
(测试点1:用户没有输入左右括号) 所以预先设一个flag=0
1)遇到左括号入栈,并设flag=1(表明由入栈过的元素)
2)遇到右括号 且 栈不为空 且 栈顶元素为对应的左括号, 出栈
3)如果栈为空, 且有多余的右括号 也匹配失败
4)如果所有括号处理完成后, 栈不为空并且flag==1, 则匹配成功
细节
top!=-1 栈内外括号没匹配成功 or 有多余的左括号
top==-1&&(a[i]==')'||a[i]==']'||a[i]=='}') 有多余的右括号
flag==0 输入数据时没有括号
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int N=110;
int main()
{
char a[N],s[N];
int top=-1;
gets(a);
int len=strlen(a);
int flag=0;
for(int i=0;i<len;i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
{
s[++top]=a[i];
flag=1;
}
else if(a[i]==')'&&top!=-1&&s[top]=='(') top--;
else if(a[i]==']'&&top!=-1&&s[top]=='[') top--;
else if(a[i]=='}'&&top!=-1&&s[top]=='{') top--;
else if(top==-1&&(a[i]==')'||a[i]==']'||a[i]=='}'))
{
printf("no\n");
return 0;
}
}
if(top==-1&&flag==1) printf("yes\n");
else printf("no\n");
return 0;
}