中綴表示式轉字尾表示式

2021-09-10 06:44:30 字數 1386 閱讀 1623

字尾表示式又叫逆波蘭表示式,在使用逆波蘭表示式時,不需要括號,操作符在運算元的後面,不需要考慮優先順序,僅僅是把棧頂的兩個元素進行操作,操作完後又進棧,直到沒有操作符後,棧頂則是結果。

維基百科的解釋:逆波蘭表示式的直譯器一般是基於堆疊的。解釋過程一般是:運算元入棧;遇到操作符時,運算元出棧,求值,將結果入棧;當一遍後,棧頂就是表示式的值。因此逆波蘭表示式的求值使用堆疊結構很容易實現,並且能很快求值。

下面分析,如何從中綴表示式轉化為字尾表示式:

例如:3 + 4 * 5

轉化為字尾表示式:3 4 5 * +

在轉化為字尾表示式時,需要注意下面幾點:

假設中綴表示式字串表示為:mid_str,字尾表示式字串表示為:be_str,用於儲存操作符的棧:oper

1.讀入的是運算元,則直接寫入be_str

2.讀入的是" + "、" - "、" * "、" / ",需要把這些操作符放進oper,但在入棧之前需要判斷操作符優先順序,如果棧頂元素的優先順序比即將入棧的操作符優先順序低,則直接把操作符入棧,否則,需要把操作符出棧,並寫入be_str

3.讀入的是" ( ",無需出棧,只需繼續入棧,在入棧前該操作符優先順序最高,入棧後最低

4.讀入的是" ) ",該操作符無需入棧,當讀到時,需要把oper棧中的操作符出棧,寫入be_str,直到遇到" ( ",最後把" ( "出棧

5.當讀完mid_str後,把oper中剩下的操作符寫入be_str

當轉化為字尾表示式後,在對字尾表示式進行進出棧,可求得表示式結果。

#include#include#include#includeusing namespace std;

void changetopostfix_exp(char *mid_exp,char *behind_exp) //轉為字尾表示式

else //操作符

else

oper.push(*p);

}else if (*p == '*' || *p == '/')

oper.push(*p);

}else if (*p == '(')

else //)出棧

oper.pop();}}

} p++;

} if (!oper.empty()) }

void main()

else //操作符,進行計算

}p++;

} cout << res.top();

system("pause");

}

這個沒有處理兩位數以上的數字,如果是多位數需要多做一些處理。

中綴表示式轉字尾表示式

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棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...

中綴表示式轉字尾表示式

演算法 1.設定乙個運算子棧 初始時可以將棧頂運算子置為 2.按順序掃瞄中綴表示式,當輸入為運算元時就將其輸出到字尾表示式中 3.當輸入為運算子時,則比較輸入運算子和棧頂運算子的優先順序。若輸入運算子的優先順序高於棧頂運算子的優先順序,則將輸入運算子入棧 否則,棧頂運算子的優先順序高於或等於輸入運算...