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

2022-03-13 17:01:20 字數 2808 閱讀 4836

把中綴表示式轉換為字尾表示式。

基本思路是。每乙個符號最開始都是懸而未決的。是否簡單的把符號放到左右數字的後面,都是由後面的符號決定。所以先插入第乙個符號。後面拿到的符號必須和之前的符號(棧頂)比較,棧頂和新符號平級或者棧頂更優先,那麼棧頂符號插入字尾表示式。

public static void main(string args)		

//caculate

public static void caculate(string expression)

}else

}else

else

else if(objexpression.get(i).tostring()==")")

tempflag.pop();

}else

tempflag.push(objexpression.get(i).tostring());}}

}}

postfixexpression.showeach();

//caculate expression.

//1.數字放入 結果棧中,符號-》pop2個數字運算,push結果。直到符號空。

mystackresultstack=new mystack();

for(int i=0;i

//一,無括號的n級符號演算法。

//如2+3*6-4轉化為236*+4-。+號不能防入2和3後面,因為*號更優先。+號必須作用於3*6和2。

//分析:

//建立乙個字尾表示式堆,乙個臨時符號棧。

//讀入的數字放入字尾表示式堆。

//讀入的符號必須和後面的符號比較,只有優先順序更高才能插入到字尾表示式堆後面。

//所以第乙個符號一定先入符號棧,等後面符號出來,才能決定棧頂符號是否放入字尾表示式堆。

//因此每次讀到運算子,決定的不是這個運算子是否放入字尾表示式,而是決定前乙個符號(棧頂符號)的去留。

//1)讀入的是數字,直接放入字尾表示式堆

//2)讀入的是符號:

// 2。1)如果符號棧為空,動作:放入棧,原因:只有乙個符號,必須等待插入數字後,並讀起後面乙個符號再處理。

// 2。2)如果符號棧非空,且優先順序》=棧頂符號,動作:放入棧。原因:棧頂符號,優先順序更低,暫時不能放入字尾表示式堆,而剛讀的符號也必須再一次等待插入數字後,並和後面乙個符號比較再處理(我們並不固定符號優先級別只有2級,)。

// 2。3)如果符號棧非空,且優先順序<=棧頂符號,動作,pop棧頂符號,防入字尾表示式堆。新讀的符號繼續和棧頂符號比較,重複第2)大步驟

// 原因:棧頂符號優先級別高,可以馬上放到它左右數字的後面形成字尾表示式。(讀入符號前,已經把棧頂的右邊數字防入字尾表示式堆)

// 繼續比較的原因,可以看作之前插入的棧頂符號,其實是插入了乙個臨時結果,而此時的棧頂符號,必須和讀入的符號,再次爭奪臨時結果的處理優先順序。自己看下2+3*6^5+2,^插入後,*和+爭奪6^5就清楚了。

//3)到達表示式結尾。動作:把符號從符號棧,從棧頂依次放入字尾表示式堆。用字尾方法,計算字尾表示式堆。

// 原因:此時符號棧的符號優先順序肯定是逐步遞增的,否則中途有乙個不是遞增那麼它之前的符號已經進入字尾表示式堆了。

//這裡2。3需要再次分析下。2。3和一直和棧頂符號比較,最終會走向2,1,或2。2。最後這個剛讀入的符號是一定會入符號棧的。

//所以,所有的符號和數字都在字尾表示式堆或臨時符號棧。而第3)又會把所有最終留下的符號放入字尾表示式堆。

//二。有括號的演算法。

//如(2+3)*6-4轉化為23+6*

//分析:

//讀入的符號碰到(,因為()內其實是乙個子表示式。必須優先處理。也就是把()內的數字和符號轉化為中綴表示式,防入到字尾表示式堆後(相當於放入了乙個臨時結果)

//棧頂的符號再和)之後的符號比較優先順序。

//1)讀入的是數字,直接放入字尾表示式堆

//2)讀入的是運算符號:

// 2。1)如果符號棧為空,動作:放入棧,原因:只有乙個符號,必須等待插入數字後,並讀起後面乙個符號再處理。

// 2。2)如果符號棧非空,且優先順序》=棧頂符號,動作:放入棧。原因:棧頂符號,優先順序更低,暫時不能放入字尾表示式堆,而剛讀的符號也必須再一次等待插入數字後,並和後面乙個符號比較再處理(我們並不固定符號優先級別只有2級,)。

// 2。3)如果符號棧非空,且優先順序<=棧頂符號,動作,pop棧頂符號,防入字尾表示式堆。新讀的符號繼續和棧頂符號比較,重複第2)大步驟。

// 原因:棧頂符號優先級別高,可以馬上放到它左右數字的後面形成字尾表示式。(讀入符號前,已經把棧頂的右邊數字防入字尾表示式堆)

// 繼續比較的原因,可以看作之前插入的棧頂符號,其實是插入了乙個臨時結果,而此時的棧頂符號,必須和讀入的符號,再次爭奪臨時結果的處理優先順序。自己看下2+3*6^5+2,^插入後,*和+爭奪6^5就清楚了。

// 2。4)如果符號棧非空,且符號是(,動作,新符號入棧,原因:(遮蔽了之前符號,(後的符號必須和之後的符號比較。

// 2。5)如果符號棧非空,且符號是),不可能存在,因為4)會保證成隊消除(),)沒有入棧的可能。

//3)讀入的是(,動作:(入棧,原因,棧頂符號,必須等待()括號內全部放入字尾表示式堆後,再和)之後的符號比較。

//4)讀入的是),動作,一直插入棧頂符號到字尾表示式堆,直到碰到(,並pop掉(。

// 為什麼一直插入符號就可以,因為此時符號棧最後的前括號(之後的符號優先順序肯定是逐步遞增的,道理和之前的演算法,第3)是一樣。

//2+3*6^5+2;

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

設以 字元作為結束符的中綴算術表示式已經儲存在s1字串中,轉換後得到的字尾算術表示式擬存於s2字串中。由中綴表示式轉換為字尾表示式的規則可知 轉換前後,表示式中的數值項的次序不變,而運算子的次序發生了變化,由處在兩個運算物件的中間變為處在兩個運算物件的後面,同時去掉了所有的括號。為了使轉換正確,必須...

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

定義 中綴表示式是乙個通用的算術或邏輯公式表示方法,操作符是以中綴形式處於運算元的中間 例 3 4 中綴表示式是人們常用的算術表示方法。字尾表示式,又稱逆波蘭式,指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則 規則轉換過程需要...

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

題目 給乙個中綴表示式 即標準形式的表示式 列印該表示式的字尾表示式。中綴表示式最大的不同就是去掉了表示運算子優先順序的括號。運算元為26個小寫或大寫的英文本母 注意不包括數字和其他字元 操作符為 一共八個。具體見例子見下圖 如下 include include include using name...