使用棧完成中綴表示式轉字尾表示式

2021-07-26 11:24:52 字數 1761 閱讀 9605

字尾表示式也稱為逆波蘭表示式。求字尾表示式的過程有很多種,這裡給出利用棧實現的過程。

現代編譯器不會直接將算術表示式轉化成機器層的**。而是使用乙個中間形式,成為字尾表達法。在字尾表示式中,運算子緊隨在它的運算元的後面,例如,給出中綴表示式a+b它的字尾形式就是ab+,對於a+b*c,字尾形式就是abc*+,說白了就是表示式樹的後序遍歷。有了字尾表示式可以很容易的進行表示式求值。上面的例子中計算的過程就是遍歷字尾表示式,遇到運算元就入棧(計算過程還是需要用到棧),遇到操作符就彈出兩個運算元進行運算,然後將結果壓棧,遍歷完成後棧中的既是表示式值。

具體過程:

先將中綴表示式看成乙個字串,遍歷中綴表示式,遇到乙個操作符將它壓棧,遇到運算元就加到字尾表示式中。舉例說明:a-b+c*d

首先遇到的是乙個a,然後將a加入字尾表示式中,然後遇到乙個-(操作符)將它壓棧,然後是乙個b,將b加入到字尾表示式中,現在的字尾表示式是ab,棧中的操作符是-。

當遇到+號時,因為優先順序相同,所以進行的操作是將-號出棧,並加入字尾表示式中,+號入棧。此時的字尾表示式為ab-,棧中儲存的是+。

然後是c,加入到字尾表示式中,現在的字尾表示式是ab-c。然後遇到*,因為*的優先順序比+高,所以將*入棧。

然後是d,將d加入字尾表示式,此時的列舉完成,之後只需要將棧中的操作符出棧依次加入到字尾表示式中即可。

得到的字尾表示式就是ab-cd*+。

進出棧的規則就是對中綴字串的每個運算子。棧為空,操作符入棧。棧不空,如果此時棧頂元素優先順序比中綴表示式中的低,將該運算子壓棧,否則,將運算子出棧加入到字尾表示式中,將該運算子入棧。

對於有括號的表示式,在中綴字串遇到乙個左括號時,無條件入棧,但是它的優先順序最低,然後在中綴表示式中遇到乙個右括號時,一直彈出棧中的操作符,直到遇到乙個左括號為止。例如:x-(y*a/b-(z+d*e)+c)/f。

將x加入字尾表示式。字尾表示式為x,棧空。

將-號入棧。字尾表示式為x,棧為-。

遇到乙個左括號,將左括號入棧。字尾表示式為x,棧為-(。

y加入字尾表示式。字尾表示式為xy,棧為-(。

將*入棧。字尾表示式為xy,棧為-(*。

a加入字尾表示式。字尾表示式為xya,棧為-(*。

遇到乙個/號,將*號出棧加入到字尾表示式中,然後將/入棧。字尾表示式為xya*,棧為-(/。

將b加入字尾表示式。字尾表示式為xya*b,棧為-(/。

遇到乙個-號,將/出棧加入到字尾表示式,然後將-入棧。字尾表示式為xya*b/,棧為-(-。

遇到左括號,入棧。字尾表示式為xya*b/,棧為-(-(。

將z加入字尾表示式。字尾表示式為xya*b/z,棧為-(-(。

將+入棧。字尾表示式為xya*b/z,棧為-(-(+。

將d加入字尾表示式。字尾表示式為xya*b/zd,棧為-(-(+。

將*入棧。字尾表示式為xya*b/zd,棧為-(-(+*。

將e加入到字尾表示式。字尾表示式為xya*b/zde,棧為-(-(+*。

遇到乙個右括號。將操作符彈出棧,直到遇到左括號。字尾表示式為xya*b/zde*+,棧為-(-。

遇到乙個+號。彈出-號加入字尾表示式,將+號入棧。字尾表示式為xya*b/zde*+-,棧為-(+。

將c加入字尾表示式。字尾表示式為xya*b/zde*+-c,棧為-(+。

遇到乙個右括號。將操作符彈出棧,直到遇到左括號。字尾表示式為xya*b/zde*+-c+,棧為-。

將/入棧。字尾表示式為xya*b/zde*+-c+,棧為-/。

然後將f加入字尾表示式,操作符彈出棧。得到的字尾表示式為xya*b/zde*+-c+f/-。

棧 中綴表示式轉字尾表示式

中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...

中綴表示式轉字尾表示式

using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...

中綴表示式轉字尾表示式

將乙個普通的中綴表示式轉換為字尾表示式的一般演算法是 首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1 含乙個結束符號 乙個作為輸入字尾表示式的棧s2 空棧 s1棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...