中綴表示式(中綴記法)
中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。
雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計算機來說,計算字首或字尾表示式的值非常簡單。
字首表示式(字首記法、波蘭式)
字首表示式的運算子位於運算元之前。
字首表示式的計算機求值:
從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧;重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果。
例如字首表示式「- × + 3 4 5 6」:
(1) 從右至左掃瞄,將6、5、4、3壓入堆疊;
(2) 遇到+運算子,因此彈出3和4(3為棧頂元素,4為次頂元素,注意與字尾表示式做比較),計算出3+4的值,得7,再將7入棧;
(3) 接下來是×運算子,因此彈出7和5,計算出7×5=35,將35入棧;
(4) 最後是-運算子,計算出35-6的值,即29,由此得出最終結果。
可以看出,用計算機計算字首表示式的值是很容易的。
詳細解釋:
給出乙個中綴表示式如下:
a+b*c-(d+e)
第一步:按照運算子的優先順序對所有的運算單位加括號,
式子變成了:((a+(b*c))-(d+e))
第二步:轉換字首與字尾表示式
字首:把運算符號移動到對應的括號前面
則變成了:-( +(a *(bc)) +(de))
把括號去掉:-+a*bc+de 字首式子出現
字尾:把運算符號移動到對應的括號後面
則變成了:((a(bc)* )+ (de)+ )-
把括號去掉:abc*+de+- 字尾式子出現
<1> 將中綴表示式「1+((2+3)*4)-5」轉換為字首表示式。
(1)構建兩個棧,乙個存運算子乙個存運算元。運算子(以括號分界點)在棧內遵循越往棧頂優先順序不降低的原則排序。
(2)從右往左掃瞄中綴式表示式,從右邊第乙個字元開始判斷。
如果當前字元是數字,則分配到數字串的結尾並將數字串直接輸出。
如果是運算子,則比較優先順序。如果當前運算子的優先順序大於等於棧頂運算子的優先順序(當棧頂是括號時,直接入棧),則將運算子直接入棧;否則將棧頂運 算符出棧並輸出,直到當前運算子的優先順序大於等於棧頂運算子的優先順序(當棧頂元素是括號直接入棧),再將當前運算子入棧。如果是括號,則根據括號的 方向進行處理。如果是括號直接入棧;否則,遇右括號前將所有的運算子全部出棧並輸出,遇右括號後將左右的兩括號一起刪除。
(3)重複上述操作(2)直至掃瞄結束,將棧內剩餘運算子全部出棧並輸出,再將綴輸出字串。中綴表示式就變成了字首表示式了。
中綴表示式
字首表示式
(棧頂)運算子棧(棧尾)說明空
5,是數字串直接輸出
-,棧內無運算子,直接入棧
),直接入棧
5 44,是數字串直接輸出
5 4*,棧頂是括號,直接入棧
5 4),直接入棧
5 4 3
3,是數字串直接輸出
5 4 3
+,棧頂是括號,直接入棧
5 4 3 2
2,是數字串直接輸出
5 4 3 2+
5 4 3 2+*
5 4 3 2+*
+,優先順序大於等於棧頂運算子,直接入棧
5 4 3 2+*1
1,是數字串直接輸出
空5 4 3 2+*1+-
空掃瞄結束,將棧內剩餘運算子全部出棧並輸出
空- + 1 * + 2 3 4 5
空逆綴輸出字串
過程和差不多,只不過是從左往右掃瞄,方向換了乙個,其他一樣。
還是這個式子:1+((2+3)*4)-5
中綴表示式
字尾表示式
(棧頂)運算子棧(棧尾)說明空
1,是數字串直接輸出
+,棧內無運算子,直接入棧
(,直接入棧
(,直接入棧
1 22 ,數字
1 2+,直接入棧
1 2 3
3,是數字串直接輸出
1 2 3 +
碰到 )找到(之前所有符號彈出出
1 2 3 +
1 2 3 + 4
1 2 3 + 4 *
碰到 )找到(之前所有符號彈出出
1 2 3 + 4 *
1 2 3 + 4 *5
空1 2 3 + 4 *5 - +
空掃瞄結束
空1 2 3 + 4 *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.字尾表示式 逆波蘭式 運算數在前面,運算子在後面 中綴 字首 優先順序先乘除再加減,入棧方向從右往左,棧外的符號想進棧,棧內的符號想出棧。棧外左括號不能進棧,棧外右括號優先順序最高。棧內右括號優先順序最低。中綴 字尾 ...
字首 中綴 字尾表示式的相互轉換方法
乙個中綴式到其他式子的轉換方法 這裡我給出乙個中綴表示式 a b c d e 第一步 按照運算子的優先順序對所有的運算單位加括號 式子變成 a b c d e 第二步 轉換字首與字尾表示式 把運算符號移動到對應的括號前面 則變成 a b c d e 把括號去掉 a b c d e 字首式子出現 把運...
字首 中綴 字尾表示式及其相互轉化的Java實現
一 中綴表示式轉換為字首 字尾表示式 給個中綴表示式 a b c d e 首先根據運算子的優先順序給所有運算單位加括號 a b c d e 將運算符號移動到對應括號的前面然後去掉所有括號就轉換為字首表示式 a bc de a bc de 將運算符號移動到對應括號的後面然後去掉所有括號就轉換為字尾表示...