棧的應用之後綴表示式求值

2021-08-30 04:37:09 字數 1520 閱讀 2587

字尾表示式,指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則)。我們數學上採用的表示式叫中綴表示式,即將運算放在兩個運算物件中間。此外還有字尾表示式,即將運算子放在兩個運算物件的前面。

下面是同乙個算術表示式的三種等價表示形式:

中綴形式:(3-5)*(6+17*4)/3

字首形式:/ * - 3 5 + 6 * 17 4 3

字尾形式:3 5 - 6 17 4 * + * 3 /

根據字尾表示式的計算規則,計算過程應該是順序檢查表示式裡的乙個個項,分兩種情況:

由於表示式可以任意複雜,不能事先確定需要記錄的資訊的項數,必須用乙個快取結構。採用什麼結構則要根據計算的性質決定。首先分析情況:

顯然,這裡的情況是典型的後儲存先使用,應該用棧作為快取結構。

def suf_exp_evaluator(exp):

operators="+-*/"

st=esstack() #棧

for x in exp:

if x not in operators: #x不是運算子,轉化為小數,壓入棧

st.push(float(x)) #轉化不成功會丟擲異常

continue #continue的作用:一直將數字壓入棧

if st.depth()<2: #乙個字尾表示式,前兩個元素肯定都是數字,如果棧的深度小於2,則表示式的長度不夠

print("表示式長度不夠")

return

a = st.pop() #從棧頂取出兩個元素

b = st.pop()

c=0 #根據當前運算子計算結果,壓入棧

if x=="+":

c=b+a

if x=="-":

c=b-a

if x=="*":

c=b*a

if x=="/":

c=b/a

st.push(c)

if st.depth()==1: #全部處理完棧裡應該只用乙個元素,否則表示式有誤

return st.pop()

else:

print("表示式有誤")

if __name__ == '__main__':

exp=input("請輸入字尾表示式(每項空格分隔):\n").split()

print(suf_exp_evaluator(exp))

測試結果為:

請輸入字尾表示式(每項空格分隔):

3 5 - 6 17 4 * + * 3 /

-49.333333333333336

可見字尾表示式的計算對於計算機來說十分簡單,是一種便於計算機計算的算術表達形式。

棧的應用之後綴表示式的求解

在小學的運算中,我們經常接觸到的數學表示式,它的規則也就是老生常談的了 先乘除,後加減,從左到右,先括號後括號外 但後來出現的四則運算,則要求優先順序,計算更加複雜,而計算機解決這種問題的方法就是利用棧,這就引入了字尾表示式 字尾表示式的基本概念 字尾表示式也叫逆波蘭表示式,是一種不需要括號的字尾表...

棧的應用之表示式求值(字尾式運算)

1 逆波蘭表示式簡介 假定給定乙個只 包含 加 減 乘 除,和括號的算術表示式,你怎麼編寫程式計算出其結果。問題是 在表示式中,括號,以及括號的多層巢狀 的使用,運算子的優先順序不同等因素,使得乙個算術表示式在計算時,運算順序往往因表示式的內容而定,不具規律性。這樣很難編寫出統一的計算指令。使用逆波...

棧的應用之表示式求值

include include include include include include using namespace std struct stacknode 用來訪問運算子的棧 struct stacknode1 用於訪問數字的棧 typedef stacknode stack type...