判斷後綴表示式正確性,並把字尾表示式轉為字首表示式
阿新 • • 發佈:2018-12-08
轉載自: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; }