例如:Exp=a*b+(c-d/e)*f
如果Exp=a*b+(c-d/e)*f,那麽它的
前綴類型為:+*ab*-c/def。
中綴公式為:a * b+c-d/e * f。
後綴是ab*cde/-fx+
綜合比較它們的關系可以得出以下結論:
1.第三個公式中的“操作數之間的相對順序相同”;
(二叉樹的三種訪問順序中,葉子的相對訪問順序是相同的)
2.三個表達式中“運算符之間的相對順序不同”;
3.中綴丟失括號信息,使得運算順序不確定;
(前綴和後綴運算只需要壹個棧來存儲操作數,中綴求值需要兩個棧,符號棧和運算。
制作壹個堆棧)
4.前綴型的運算規則是:連續出現的兩個操作數和在它們之前且靠近它們的運算符構成壹個最小表達式;
5.後綴類型的運算規則是:
& ampmiddot運算符在公式中出現的順序正好是表達式的運算順序;
& ampmiddot的每個運算符和出現在它之前和附近的兩個操作數構成壹個最小表達式;
6.中綴求值的算術規則:
如果是操作數,則直接放入堆棧。
如果是運營商。這是與當前堆棧頂部進行比較。如果它高於當前棧頂,則將其放入棧中。如果低,說明當前棧頂最高,必須先計算。根據編譯原理,當前棧頂已經是最左邊的素數短語)
其實中綴表達式的直接求值和中綴表達式轉換成後綴表達式的過程驚人的相似,只不過直接求值是為了找出,而轉換成後綴是為了輸出。
中綴表達式的直接求值算法:
OPNDType EvalueExpression()
{//OPTR和OPND分別是操作符棧和操作數棧。
init stack(OPTR);Push(OPTR,' # ');
init stack(OPND);c = getchar();
而(c!='#'|| GetTop(OPTR)!='#')
{
如果(!IN(c,OP)) //如果是操作數,直接進入操作數棧。
{ push(OPND,c);
c = getchar();
}
Else //如果是運算符,則與當前棧頂進行比較。
{
switch(precend(GetTop(OPTR),c))
{
大小寫' & lt':push(OPTR,c);//高於放入堆棧的當前棧頂。
c = getchar();
打破;
Case '= ':Pop(OPTR,x);//在我們設計的優先級表中,
c = getchar();//只有“(”和“)”相等。
打破;//而規範中間只有'(' ')'。
//所以我們可以只彈出'('。
大小寫“>”://如果低於當前棧頂,應該先計算棧頂(先指定)。
pop(OPTR,theta);//彈出棧頂運算符。
Pop(OPND,b);//取操作數,是前壹個操作數。
Pop(OPND,a);//在底部(堆棧中先入後出)
Push(OPND,Operate(a,theta,b));//操作的結果放入堆棧。
//(他是其他運算符的操作數)
打破;
}//開關
}//否則
}//whild
返回GetTop(OPND);//最後留在操作數堆棧裏的是整個表達式的結果。
}
如果妳對考研有疑問,不知道考研中心的內容怎麽總結,不了解考研報名的地方政策,點擊最下方咨詢官網,免費獲取復習資料:/xl/