表达式括号匹配(字符数组栈)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[2000];
char seqstack[2000];//字符数组构成的栈比整型数组构成的栈形象多了,因为'\0'本身就完全符合pop
scanf("%s",str);
int len=strlen(str);
int i;
int j=0,cnt=0;
for(i=0;i<len;i++) //数字运算符根本不考虑,只有左括号进栈,右括号直接判断
{
if(str[i]==')') //三个也没法构造函数,因为)比(大1,但}比{大2,]比[大2,所以不能统一构造函数
{
if(i==0)
{
printf("no\n");
cnt++; //cnt是为了避免在对左括号判断时又输出一次no
break;
}
else
{
if(seqstack[j-1]=='(')
{
seqstack[j-1]=0; //这里j-1很关键,因为先有右括号一定错,也不会到这不来,所以只用考虑先左括号,因为有j++,所以要用j-1
j--; //pop操作
}
else
{
printf("no\n");
cnt++;
break;
}
}
}
else if(str[i]==']')
{
if(i==0)
{
printf("no\n");
cnt++;
break;
}
else
{
if(seqstack[j-1]=='[')
{
seqstack[j-1]=0;
j--;
}
else
{
printf("no\n");
cnt++;
break;
}
}
}
else if(str[i]=='}')
{
if(i==0)
{
printf("no\n");
cnt++;
break;
}
else
{
if(seqstack[j-1]=='{')
{
seqstack[j-1]=0;
j--;
}
else
{
printf("no\n");
cnt++;
break;
}
}
}
else if(str[i]=='('||str[i]=='['||str[i]=='{')
{
seqstack[j]=str[i];
j++;
}
} //for结束才判断左括号是否多余,而右括号是即时比较的
len=strlen(seqstack);
if(len==0)
printf("yes\n");
else
{
if(cnt==0)
printf("no\n");
}
return 0;
}