假设表达式中允许包含 3 种括号:圆括号、方括号和大括号。编写一个算法判断
表达式中的括号是否正确配对。
解:设置一个栈 st,扫描表达式 exp,遇到‘(’、‘[’或‘{’,则将其进栈;遇到‘)’,
若栈顶是‘(’,则继续处理,否则以不配对返回假;遇到‘]’,若栈顶是‘[’,则继续处理,
否则以不配对返回假;遇到‘}’,若栈顶是‘{’,则继续处理,否则以不配对返回假。在
exp 扫描完毕,若栈不空,则以不配对返回假;否则以括号配对返回真。本题算法如下:
bool Match(char exp[],int n)
{ LinkStNode *ls;
InitStack(ls);
int i=0;
ElemType e;
bool flag=true;
while (i<n && flag)
{ if (exp[i]=='(' || exp[i]=='[' || exp[i]=='{')
Push(ls,exp[i]); //遇到'('、'['或'{',则将其进栈
if (exp[i]==')') //遇到')',若栈顶是'(',则继续处理,否则以不配对返回
{ if (GetTop(ls,e))
{ if (e=='(') Pop(ls,e);
else flag=false;
}
else flag=false;
}
if (exp[i]==']') //遇到']',若栈顶是'[',则继续处理,否则以不配对返回
{ if (GetTop(ls,e))
{ if (e=='[') Pop(ls,e);
else flag=false;
}
else flag=false;
}
if (exp[i]=='}') //遇到'}',若栈顶是'{',则继续处理,否则以不配对返回
{ if (GetTop(ls,e))
{ if (e=='{') Pop(ls,e);
else flag=false;
}
else flag=false;
}
i++;
}
if (!StackEmpty(ls)) flag=false; //若栈不空,则不配对
DestroyStack(ls);
return flag;
}