正如我們常常潛意識認為我們所說的數字都是十進位制,對於數字的其他進製感覺不正確一樣,其實只是我們不熟悉而已,其他進製其實也不過就是一種對資料的表達方式而已。對於我們的表示式也是一樣。
eg:表示式2*3+(5-7);
我們上面所看到的也就是我們平時常用的書寫表示式的方式就是我們所謂的「中綴表示式」
字首表示式與字尾表示式都是一種沒有括號的算術表示式,兩者都與中綴表示式有所不同。字首表示式其將運算子寫在前面,運算元寫在後面。字尾表示式其將運算子寫在後面,運算元寫在前面。
這裡我給出乙個中綴表示式:a+b*c-(d+e)
第一步:按照運算子的優先順序對所有的運算單位加括號式子變成:((a+(b*c))-(d+e))
第二步:轉換字首與字尾表示式
把運算符號移動到對應的括號前面,則變成了:-(+(a*(bc))+(de)),去掉括號即字首式: - + a * b c + d e
把運算符號移動到對應的括號後面,則變成了:((a(bc)* )+(de)+ )-,去掉括號即字尾式:a b c * + d e + -
我們發現字首式,字尾式他們都是不需要用括號來進行優先順序的確定的。
轉化過程需要用到棧,具體操作如下
(1):從右向左遍歷如果遇到運算元,我們就直接將其輸出。
(2):如果遇到操作符,則我們將其放入到棧中,遇到右括號時我們也將其放入棧中。(操作符放入有條件,看4)
(3): 如果遇到乙個左括號,則將棧元素彈出,將彈出的操作符輸出直到遇到左括號為止。注意,左括號只彈出並不輸出。
(4): 當前操作符進行壓棧時,如果發現當前棧頂元素優先順序小於等於自己(或者棧為空)時,當前操作符直接壓棧;但如果當前棧頂元素優先順序大於當前操作符,當前的操作符就不能入棧,先需要將棧頂元素輸出,接著和最新的棧頂元素比較,直到發現比自己優先順序低的元素(或者棧為空),當前的操作符才可以壓到棧中。
ps:如果棧頂元素是「)」,我們直接插入當前的操作符,因為「)」只有在遇到" ( "的情況下我們才彈出" ) ",其他情況我們都不會彈出" ) "。而且括號彈出但是並不輸出。
(5): 如果我們讀到了輸入的末尾,則將棧中所有元素依次輸出。
(6):最後一步是將當前輸出的總的表示式翻轉即可。
例項操作:中綴表示式 a+b*c-(d+e)
首先從右向左我們讀到「)」,直接壓棧;輸出e;棧頂元素為「)」,+直接壓棧;輸出d;遇到「(」,彈出+;棧為空,-壓棧;輸出c;*優先順序高於-,*入棧;輸出b;+優先順序低於*,輸出*,+優先順序高於-,+入棧;輸出a;當前表示式遍歷完成,將棧內剩餘元素全部輸出,即輸出+,輸出-;
當前所有的輸出為:e d + c b * a + -
將當前輸出的表示式翻轉的最終的字首表示式即:- + a * b c + d e
轉化過程依舊需要用到棧,具體操作如下
(1):從左向右遍歷如果遇到運算元,我們就直接將其輸出。
(2):如果遇到操作符,則我們將其放入到棧中,遇到左括號時我們也將其放入棧中。(操作符放入有條件,看4)
(3): 如果遇到乙個右括號,則將棧元素彈出,將彈出的操作符輸出直到遇到左括號為止。注意,左括號只彈出並不輸出。
(4): 當前操作符進行壓棧時,如果發現當前棧頂元素優先順序小於自己(或者棧為空)時,當前操作符直接壓棧;但如果當前棧頂元素優先順序大於當前操作符,當前的操作符就不能入棧,先需要將棧頂元素輸出,接著和最新的棧頂元素比較,直到發現比自己優先順序低的元素(或者棧為空),當前的操作符才可以壓到棧中。
ps:如果棧頂元素是「(」,我們直接插入當前的操作符,因為「(」只有在遇到" ) "的情況下我們才彈出" ( ",其他情況我們都不會彈出" ( "。而且括號彈出但是並不輸出。
5)如果我們讀到了輸入的末尾,則將棧中所有元素依次輸出。
例項操作:中綴表示式 a+b*c-(d+e)
首先讀到a,輸出a; 讀到+,因為棧目前為空將+壓棧;輸出b; *的優先順序大於+,將*壓棧;輸出c; -運算子優先順序小於*,輸出*,-運算子優先順序小於+,輸出+,當前棧為空,壓入-;遇到「(」,直接壓棧;輸出d;+運算子所要比較的當前的棧頂元素是"(",所以直接壓棧;輸出e;遇到「)」,將棧裡面「(」之前的操作符全都輸出,即輸出+;當前表示式已經遍歷完,所以將棧裡剩餘操作符全部輸出,即輸出-。所以我們最終的結果就是a b c * + d e + -
對於上面所舉的例子,中綴表示式是2*3+(5-7),其字首表示式是:+ * 2 3 - 5 7 字尾表示式是 2 3 * 5 7 - +
字首轉中綴
從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算,並將結果入棧;重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果。
例如字首表示式「+ * 2 3 - 5 7」:
字尾轉中綴
基本思路和上面的一樣:遞迴,碰到操作符就進入遞迴。
從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(注意,次棧頂元素是前一位(eg:被減數),棧頂元素是後一位(eg:減數)),並將結果入棧;重複上述過程直到表示式最右端,最後運算得出的值即為表示式的結果。
例如字尾表示式「2 3 * 5 7 - +」:
中綴表示式 字首表示式 字尾表示式
中綴表示式 中綴記法 中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。...
字首表示式 中綴表示式 字尾表示式。
表示式 就是式子。是由數字 算符 數字分組符號 自由量和約束量組成的。人們一般習慣寫出來的式子,叫做中綴表示式。因為在計算機中,不方便表達 數字分組符號。所以 波蘭人發明了一種把去符號化的表示式。字首表示式 字首表示式 沒有括號,算符在前 數字在後。波蘭數學家發明,為了紀念,又叫做波蘭式。跟其對應,...
字首表示式 中綴表示式 字尾表示式
字首表示式 中綴表示式 字尾表示式都是四則運算的表達方式,用以四則運算表示式求值 即數學表示式的求職 中綴表示式 簡介中綴表示式就是常見的運算表示式,如 3 4 5 6 字首表示式 簡介字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前 比如 3 4 5 6 字首表示式的計算機求值 從右至左掃瞄...