字首表示式(又稱為波蘭表示式)
中綴表示式
字尾表示式(又稱為逆波蘭表示式)
平時我們見到的都是:2+3*5,這樣的算數表示式(中綴),我們數學中也就是用這種
這種表示式(中綴)只適合人來讀寫,不適合計算機,所以為了方便計算機讀取正確的表示式就有了字首和字尾表示式
字首轉中綴,中綴轉字首
中綴轉字尾,字尾轉中綴
前字尾之間的相互轉換可以用中綴作為中間商來解決,或者也可以構造語法樹遍歷來解決
字首轉字尾的具體實現**(構造樹實現)例子:2+(3-1)*4(中綴,語法樹中序遍歷可以得到)
231-4 * + (字尾,語法樹後序遍歷可以得到,其他方法得到也行,表示式不唯一)
+2*-314 (字首,語法樹先序遍歷可以得到)
為了方便理解,我畫了表示式的 語法樹:
葉子節點都是數,非葉子節點都是運算子。畫圖很簡單就不贅述了
如果僅僅是寫題目,僅需把語法樹用前序遍歷(又稱為先序遍歷)一遍即可得到答案 +2*-314(字首表示式)
但一般實現是使用棧
思路:首先要處理字串,運算子的優先順序,多位數字看成整體(比如23看成乙個整體而不是2和3),我的例子中沒那麼複雜
建立兩個棧,乙個是數字棧(裡面存的是最終結果),乙個是運算子棧
從右往左 掃瞄中綴表示式
若是運算子,則與運算子棧頂元素比較優先順序:
若該運算子優先順序大於等於棧頂元素,則將該運算子入棧;
若該運算子優先順序小於棧頂元素,則運算子棧內元素出棧並壓入數字棧,再與其比較,直到該運算子優先順序大於等於棧頂元素的優先順序時,將該運算子壓入棧中。
注意:我們先在運算子棧中壓入乙個『#』 規定其優先順序為最低 這樣解決了開始時候的邊界問題)
注意:遇到右括號直接壓入棧中,遇到乙個左括號,那麼就將運算子棧元素彈出並壓入數字棧直到遇到右括號,並且把右括號彈出,停止彈出。這個過程,兩個括號都不加入數字棧。
表示式遍歷完後,若運算子棧還有元素,則依次彈出壓入數字棧。
把數字棧元素從棧頂依次彈出,就得到字首表示式。
**實現:
例:1-(2+3) 轉換字首是:- 1 + 2 3例:1+((2+3)*4)-5 轉換字首是:- + 1 * + 2 3 4 5
例:123+((246+39)*48)-55 轉換字首是:- + 123 * + 246 39 48 55
#include
#include
#include
#include
using
namespace std;
const
int maxn=
1005
;typedef
struct nodenode;
node node[maxn]
;string s;
intchange()
else
if(s[i]
=='+'
||s[i]
=='-'
)else
if(s[i]
=='('
||s[i]
==')'
)else
if(s[i]
>=
'0'&&s[i]
<=
'9')
node[w1]
.ch=s.
substr
(i,j-i)
; node[w1]
.level=
100;
w1++
; i=j-1;
}}return w1;
}void
solove
(int l)
else
w3--;}
else
q[w3++
]=node[i];}
}}while
(w3!=1)
for(
int i=w2-
1;i>=
0;i--
)return;}
intmain()
(這一點網上的資料很少)
例子:+2*-314(字首)-----> 2+((3-1)*4)(中綴)
思路:準備乙個棧
從右往左掃瞄字首表示式
遇見數字壓入數字棧
遇見運算子棧,則彈出數字棧的兩個元素,並且運算,前後還要新增括號,然後壓入棧
例如:棧中有2和3(2個元素),現在遇見+了,則把 (2+3) 壓入棧,棧中現在就有5個元素了,後面的依次類推
結果中肯定會出現很多多餘的括號,也可以解決但是比較複雜就不詳細說了
**實現:
實現起來較為複雜,有機會補上…
寫答案的話後序遍歷的語法樹,可以直接得到答案
思路:和中綴轉字首差不多,只是方向改變了
從左往右掃瞄中綴表示式
其他的與中綴轉字首的操作一樣
這裡有一篇**部落格,方便大家理解思路:
與字首轉中綴的思路一樣
從右往左掃瞄字尾表示式
遇見數字壓入數字棧
遇見運算子棧,則彈出數字棧的兩個元素,並且運算,前後還要新增括號,然後壓入棧
例如:棧中有2和3(2個元素),現在遇見+了,則把 (2+3) 壓入棧,棧中現在就有5個元素了,後面的依次類推
1 2 3 + 4 *5 - +例如:
從左往右掃瞄先碰到+號,取+號前面兩個運算元:2,3 得到:(2+3).
繼續往下掃碰到*號,取4 和2+3 得到:((2+3)*4)
-號,取(2+3)*4和5得到::(((2+3)*4)-5))
+號:取(2+3)*4-5和1得到::1+(((2+3)*4)-5))
如果把多餘的括號省略就是1+(2+3)*4-5
如有錯誤,不吝賜教
中綴 字首 字尾表示式 相互轉換
1.中綴表示式 便於人看 2.字首表示式 波蘭式 運算子在前面,運算數在後面 3.字尾表示式 逆波蘭式 運算數在前面,運算子在後面 中綴 字首 優先順序先乘除再加減,入棧方向從右往左,棧外的符號想進棧,棧內的符號想出棧。棧外左括號不能進棧,棧外右括號優先順序最高。棧內右括號優先順序最低。中綴 字尾 ...
算術表示式的字首,中綴,字尾相互轉換
中綴表示式 中綴記法 中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。...
字首 中綴 字尾表示式的相互轉換方法
乙個中綴式到其他式子的轉換方法 這裡我給出乙個中綴表示式 a b c d e 第一步 按照運算子的優先順序對所有的運算單位加括號 式子變成 a b c d e 第二步 轉換字首與字尾表示式 把運算符號移動到對應的括號前面 則變成 a b c d e 把括號去掉 a b c d e 字首式子出現 把運...