版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82938703
假设表达式中允许包括两种括号。圆括号与方括号,其嵌套的顺序随意,即([]()) 或 [([][])]等为正确的格式,[(]) 或 ([())或(()])均为不正确的格式。我们需要输入表达式,检验括号是否是匹配的。
运行结果:
思路:依次扫描各个符号,每遇到结束符都找到最近的符号来匹配,不匹配或者未找到就报错,最后应括号完全匹配完毕。
算法实现:
Status Match(char *exp){
//括号匹配检验
//依次扫描各个符号,每遇到结束符都找最近的符号来匹配,
//不匹配或者未找到就报错,最后应括号完全匹配毕
SqStack<char> S;
char e;
InitStack(S); //初始化一个空栈
int HasErr=0,i=0;
while(exp[i]!='\0'&&!HasErr){ //逐个扫描符号
switch(exp[i]){
case '(':
case '[':
case '{':
Push(S,exp[i]);
break;
case ')':
if(StackEmpty(S)) //如果栈空则报错
HasErr=1;
else{
Pop(S,e);//否则出栈
if(e!='(')//弹出元素与当前元素不匹配,报错
HasErr=1;
}
break;//否则无动作,扫描符号
case '}':
if(StackEmpty(S))
HasErr=1;
else{
Pop(S,e);
if(e!='{')
HasErr=1;
}
break;
case ']':
if(StackEmpty(S))
HasErr=1;
else{
Pop(S,e);
if(e!='[')
HasErr=1;
}
break;
}
i++;
}
if(HasErr||!StackEmpty(S)) //若有错或者不是空栈就不匹配
return FALSE;
return TRUE;//否则匹配
}