1. 程式人生 > >判斷後綴表示式正確性,並把字尾表示式轉為字首表示式

判斷後綴表示式正確性,並把字尾表示式轉為字首表示式

轉載自: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;
}