转载自:weixin_41133154 https://me.csdn.net/weixin_41133154
指针从最后边扫描起,遇到操作符则存入栈中并且从表达式中删除该操作符,同时标记其匹配的操作数为0,如果遇到操作数,则应该对栈顶的操作符的配对操作数加一,当新来一个操作符时,对前面操作符的操作数配对期望降低,转而对新来的操作符先行配对操作数。当一个操作符成功配对两个操作数时,其配对期望程度为0,从栈中取出,插入到其两个操作数的前面,整体作为此时栈顶操作符新的操作数,并记录到栈顶操作符的操作数匹配数中。如果此时该栈顶操作符的操作数匹配恰好又为2,则再次取出,插入到其两个操作数前面,迭代此过程,直到栈顶操作符的操作数匹配数不足2或者栈空为止。
算法包含对后缀正确的判断,错误的后缀式(不算怪异字符,如不应该出现的‘】’‘&’等等)有两种情况,一种是取栈中元素时栈为空,说明此时后缀式存在非法的操作数过多的子表达式,第二种是表达式转换完栈不空,说明后缀式操作符过多。
Status Convert(Expression *exp)
{//算法将后缀式exp转换为前缀式,如果后缀式不合法,则返回ERROR
SeqStack S;
InitStack(&S);
Revers(exp);//revers the expression
Ptr p = exp;
while (p->next!=NULL)//expression is still not over
{
if (Is_optr(p->next->ch))//is it an operator?
{
StackElem optr;
optr.optr = p->next->ch;
optr.its_oprd = 0;
Push(&S, optr);
Delet(exp, p);//delete the operator from expression
}
else
{
if (IsEmpty(&S))
return ERROR;//expression is illegal!
else
{
while (!IsEmpty(&S))
{
StackElem optr;
GetTop(&S, &optr);
Pop(&S);
if (++optr.its_oprd < 2)
{
Push(&S, optr);
break;
}
else
{
p = p->next;
Insert(exp, p, optr.optr);
}
}
p = p->next;
}
}
}
if (!IsEmpty(&S))
return ERROR;//expression is illegal!
Revers(exp);
return OK;
}