日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算术表达式的前缀式、中缀式、后缀式相互转换

發(fā)布時間:2024/8/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算术表达式的前缀式、中缀式、后缀式相互转换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

中綴表達式(中綴記法)
中綴表達式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處于操作數(shù)的中間。中綴表達式是人們常用的算術表示方法。
雖然人的大腦很容易理解與分析中綴表達式,但對計算機來說中綴表達式卻是很復雜的,因此計算表達式的值時,通常需要先將中綴表達式轉(zhuǎn)換為前綴或后綴表達式,然后再進行求值。對計算機來說,計算前綴或后綴表達式的值非常簡單。

前綴表達式(前綴記法、波蘭式)
前綴表達式的運算符位于操作數(shù)之前。

前綴表達式的計算機求值:
從右至左掃描表達式,遇到數(shù)字時,將數(shù)字壓入堆棧,遇到運算符時,彈出棧頂?shù)膬蓚€數(shù),用運算符對它們做相應的計算(棧頂元素 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,由此得出最終結果。
可以看出,用計算機計算前綴表達式的值是很容易的。

詳細解釋:http://blog.csdn.net/antineutrino/article/details/6763722/

給出一個中綴表達式如下:
a+b*c-(d+e)?
第一步:按照運算符的優(yōu)先級對所有的運算單位加括號,
???????? 式子變成了:((a+(b*c))-(d+e))?
第二步:轉(zhuǎn)換前綴與后綴表達式?
???????? 前綴:把運算符號移動到對應的括號前面?
?????????????? 則變成了:-( +(a *(bc)) +(de))?
?????????????? 把括號去掉:-+a*bc+de?? 前綴式子出現(xiàn)?
???????? 后綴:把運算符號移動到對應的括號后面?
?????????????? 則變成了:((a(bc)* )+ (de)+ )-?
?????????????? 把括號去掉:abc*+de+-?? 后綴式子出現(xiàn)

<1> 將中綴表達式“1+((2+3)*4)-5”轉(zhuǎn)換為前綴表達式。

(1)構建兩個棧,一個存運算符一個存操作數(shù)。運算符(以括號分界點)在棧內(nèi)遵循越往棧頂優(yōu)先級不降低的原則排序。

(2)從右往左掃描中綴式表達式,從右邊第一個字符開始判斷。

??如果當前字符是數(shù)字,則分配到數(shù)字串的結尾并將數(shù)字串直接輸出。

??如果是運算符,則比較優(yōu)先級。如果當前運算符的優(yōu)先級大于等于棧頂運算符的優(yōu)先級(當棧頂是括號時,直接入棧),則將運算符直接入棧;否則將棧頂運??算符出棧并輸出,直到當前運算符的優(yōu)先級大于等于棧頂運算符的優(yōu)先級(當棧頂元素是括號直接入棧),再將當前運算符入棧。如果是括號,則根據(jù)括號的??方向進行處理。如果是括號直接入棧;否則,遇右括號前將所有的運算符全部出棧并輸出,遇右括號后將左右的兩括號一起刪除。

(3)重復上述操作(2)直至掃描結束,將棧內(nèi)剩余運算符全部出棧并輸出,再將綴輸出字符串。中綴表達式就變成了前綴表達式了。

?

中綴表達式 前綴表達式 (棧頂)運算符棧(棧尾) 說明
5 5 5,是數(shù)字串直接輸出
- 5 - -,棧內(nèi)無運算符,直接入棧
5 -) ),直接入棧
4 5 4 -) 4,是數(shù)字串直接輸出
* 5 4 -)* *,棧頂是括號,直接入棧
) 5 4 - ) * ) ),直接入棧
3 5 4 3 - ) * ) 3,是數(shù)字串直接輸出
+ 5 4 3 - ) * ) + +,棧頂是括號,直接入棧
2 5 4 3 2 - ) * )+ 2,是數(shù)字串直接輸出
( 5 4 3 2+ - ) * (,
( 5 4 3 2+* - (,
+ 5 4 3 2+* -+ +,優(yōu)先級大于等于棧頂運算符,直接入棧
1 5 4 3 2+*1 -+ 1,是數(shù)字串直接輸出
5 4 3 2+*1+- 掃描結束,將棧內(nèi)剩余運算符全部出棧并輸出
- + 1 * + 2 3 4 5 逆綴輸出字符串

【2】中綴表達式轉(zhuǎn)換為后綴表達式

?

過程和【1】差不多,只不過是從左往右掃描,方向換了一個,其他一樣。

還是這個式子:1+((2+3)*4)-5

?

中綴表達式 后綴表達式 (棧頂)運算符棧(棧尾) 說明
1 1 1,是數(shù)字串直接輸出
+ 1 + +,棧內(nèi)無運算符,直接入棧
1 +( (,直接入棧
1 +(( (,直接入棧
2 1?2 +(( 2 ,數(shù)字
+ 1?2 +((+ +,直接入棧
3 1?2 3 +((+ 3,是數(shù)字串直接輸出
1?2 3 + +( 碰到 )找到(之前所有符號彈出出
* 1?2 3 + +(* *
4 1?2 3 + 4 +(* 4
1?2 3 + 4 * + 碰到 )找到(之前所有符號彈出出
- 1?2 3 + 4 * + - -
5 1?2 3 + 4 *5 + - 5
1?2 3 + 4 *5 - + 掃描結束
1?2 3 + 4 *5 - + 逆綴輸出字符串

?

后綴表達式逆向求解中綴表達式

1?2 3 + 4 *5 - + 基本思路和上面的一樣:遞歸,碰到操作符就進入遞歸。 從左往右掃描先碰到+號,取+號前面兩個操作數(shù):2,3 得到:2+3. 繼續(xù)往下掃碰到*號,取4 和2+3 得到:(2+3)*4 -號,取(2+3)*4和5得到::(2+3)*4-5 +號:取(2+3)*4-5和1得到::1+(2+3)*4-5

?

總結

以上是生活随笔為你收集整理的算术表达式的前缀式、中缀式、后缀式相互转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。