判断后缀表达式正确性,并把后缀表达式转为前缀表达式

转载自: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42034217/article/details/84888970