前面也說過,對於計算機來說(不僅僅是計算機)中綴表示式都是複雜的,它要考慮到優先順序的問題,很傷腦筋,至於中綴向字尾的轉換也是乙個很傷腦筋的事情,在轉換的過程中要考慮到很多優先順序的情況。
好了,既然跟優先順序有關,那麼我們就應該為各個運算符號設定乙個優先順序,我們很明顯對於加減乘除的優先順序已經很明顯能知道怎麼設定,關鍵是擴號這個擁有最高優先順序的符號該怎麼設定優先順序。在考慮這個問題之前我們首先考慮一下沒有括號的中綴表示式怎麼轉換成字尾
首先,設定優先順序:
priority =
這是我們已知的最簡單設定的優先順序
考慮實現的話,我們建立乙個棧用於儲存運算子,列表用於儲存慢慢形成的字尾表示式:
s = stack()
exp =
infix_operators = '+-*/'
分析一下中綴怎麼轉換成字尾,對於遇到數字,直接放在字尾表示式的表中就可以了。經過分析,我們應該清楚,每次想加入乙個運算子到字尾表示式中時總是要比較一下它與它在中綴表示式後面的乙個符號的優先順序大小;如果他的優先順序大於後面乙個,直接將他加入到字尾表示式中,如果他的優先順序小於後面乙個,我們只有先將它壓到棧中,在待它的下乙個運算子加入到字尾表示式中後再講它加入到字尾表示式中。
我想以上就是整個轉換過程中的關鍵。
def trans_infix_suffix(line):
line = line.split(" ")
st = stack()
# 這裡棧用於處理運算子
exp =
# 這裡的列表用於儲存字尾表示式
for i in line:
if i not in infix_operators:
# 遇到數字我們直接加進去就好
elif st.is_empty():
st.push(i)
# 如果棧是空的,那說明它還要比較下乙個運算子的優先順序
else:
while not st.is_empty():
if priority[i] > priority[st.top()]:
break
else:
st.push(i)
# 關鍵在於每次放進去符號之前都要比較一下,它與下乙個運算子的優先順序大小
while not st.is_empty():
return " ".join(exp)
上面就是轉換乙個沒有括號的中綴,下面我們看一下包含括號的。
from 棧的順序表實現 import stack
priority =
# 括號設定乙個優先順序比較低
infix_operators = "+-*/()"
def trans_infix_suffix(line):
line = line.split(" ")
st = stack()
# 這裡棧用於處理運算子
exp =
# 這裡的列表用於儲存字尾表示式
for i in line:
if i not in infix_operators:
elif st.is_empty() or i == '(':
st.push(i)
# 遇到括號我們直接插入就行了
elif i == ")":
x = st.pop()
while x != '(':
x = st.pop()
else:
while not st.is_empty():
if priority[i] > priority[st.top()]:
break
else:
st.push(i)
while not st.is_empty():
return " ".join(exp)
中綴轉換為字尾大概就是這樣,其實裡面的我也講的不是很清楚,大概理解。 中綴向字尾轉換表示式
解答總結 中綴表示式就是我們通常所書寫的數學表示式,字尾表示式也稱為逆波蘭表示式,在編譯程式對我們書寫的程式中的表示式進行語法檢查時,往往就可以通過逆波蘭表示式進行。我們所要設計並實現的程式就是將中綴表示的算術表示式轉換成字尾表示,例如,將中綴表示式 a 一 b c 十 d e f 十 g 轉換為字...
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 你會發現現在是不需要括號了 這時我們...