解答總結
中綴表示式就是我們通常所書寫的數學表示式,字尾表示式也稱為逆波蘭表示式,在編譯程式對我們書寫的程式中的表示式進行語法檢查時,往往就可以通過逆波蘭表示式進行。我們所要設計並實現的程式就是將中綴表示的算術表示式轉換成字尾表示,例如,將中綴表示式
(a 一 (b*c 十 d)*e) / (f 十 g )
轉換為字尾表示為:
abc*d十e*--fg十/
注意:為了簡化程式設計實現,假定變數名均為單個字母,運算子只有+,-,*,/ 和^(指數運算),可以處理圓括號(),並假定輸入的算術表示式正確。
要求:使用棧資料結構實現 ,輸入的中綴表示式以#號結束
整數n。表示下面有n個中綴表示式
n個由單個字母、整數和運算子構成的表示式
n個字尾表示式。
測試樣例1
1
(a-(b*c+d)*e)/(f+g)#
abc*d+e*-fg+/
測試樣例2
2
a+b*c-d#
a-b*(c+d)#
abc*+d-
abcd+*-
#include
#include
#include
using
namespace std;
stack <
char
> s;
intmain()
elseif(
isalnum
(in[t]))
else
if(in[t]
=='('
)else
if(in[t]
==')'
) s.
pop();
}else
if( in[t]
=='-'
&&( in[t -1]
=='('
|| in[t -1]
=='*'
|| in[t -1]
=='/'
|| in[t -1]
=='%'
|| in[t -1]
=='+'
|| in[t -1]
=='-'))
else
else
char chtmp = s.
top();
//chtmp此時是棧頂的元素
switch
(in[t]
)//10^2^2當然便是剛輸入這個^優先級別更高,因為後面還可以繼續續上^2,變成10^2^2^2
case
'*':
case
'/':
case
'+':
case
'-':
}switch
(chtmp)
case
'*':
case
'/':
case
'(':
case
'+':
//如果之前是乙個加號,此時的ch仍然是乙個加號,那麼理應該輸出這個+號的,所以相應的之前的優先順序大一點
case
'-':}if
(y > x || y == x)
else}}
} t++;}
while
(!s.
empty()
) cout<}}
本題目主要的點也就是出現在對於負數的處理上面,以下給出一些樣例供參考
10
14*10-(10)*2#
14*10-(-10)*2#
14*10--10*2#
-14*-12#
-(1-2*-3)#
-3^-(1-2*-3)#
30/(-3+3)+1#
(-2)--3*(-8)#
-2--3*-8#
-a+b#
中綴向字尾表示式的轉換
前面也說過,對於計算機來說 不僅僅是計算機 中綴表示式都是複雜的,它要考慮到優先順序的問題,很傷腦筋,至於中綴向字尾的轉換也是乙個很傷腦筋的事情,在轉換的過程中要考慮到很多優先順序的情況。好了,既然跟優先順序有關,那麼我們就應該為各個運算符號設定乙個優先順序,我們很明顯對於加減乘除的優先順序已經很明...
6 從中綴向字尾轉換表示式
成績 10開啟時間 2018年10月20日 星期六 19 00 折扣0.8 折扣時間 2018年11月10日 星期六 23 55 允許遲交 否關閉時間 2018年11月21日 星期三 23 55 問題描述 中綴表示式就是我們通常所書寫的數學表示式,字尾表示式也稱為逆波蘭表示式,在編譯程式對我們書寫的...
中綴表示式轉換字尾表示式
中綴表示式是最自然 最易被人類理解的表達方式,但是計算機處理起來並不顯得方便,這時,字尾表示式就發揮作用了 例如 計算表示式 a b c d 的值,程式裡需要不斷的判斷運算子的優先順序,先計算括號裡的子表示式 假如我們將上述表示式轉換為字尾表示式 a b c d 你會發現現在是不需要括號了 這時我們...