棧應用之 字尾表示式計算 (python 版)

2022-08-19 02:39:09 字數 1563 閱讀 7349

字尾表示式特別適合計算機處理

中綴表示式:(3 - 5) * (6 + 17 * 4) / 3    17 * 4 + 6字首表示式:/ * - 3 5 + 6 * 17 4 3        * 17 4 + 6字尾表示式:3 5 - 6 17 4 * + * 3 /        17 4 * 6 +

假定 st 是乙個棧 (棧的特點:後進先出 lifo) 

比如 【3 / 5】 即 【3 5 / 】;

3 先壓入棧,而後 5 出棧;

元素在棧裡面的順序應該是 【5,3】;

5 先出棧,而後 3 出棧。

所以第個運算物件先出棧,第個運算物件後出棧。

1

#擴充棧的方法 計算棧元素個數

2class

esstack(sstack):

3"""

docstring for ess

"""4

defdepth(self):

5return len(self._elems)

1

defauf_exp_evaluator(exp):

2 operatora = '

+-*/

'3 st = esstack() #

擴充功能的棧,可用depth()檢查元素個數45

for x in

exp:

6if x not

inoperatora:

7st.push(flaot(x))

8continue

#跳過本次for迴圈910

if st.depth() < 2:

11raise syntaxerror

12 a = st.pop() #

取出第二個運算物件

13 b = st.pop() #

取出第乙個運算物件

1415

if x == "+"

:16 c = b +a

17elif x == "-"

:18 c = b -a

19elif x == "*"

:20 c = b *a

21elif x == "

/" : #

這裡可能引發異常 zerodivisionerror

22 c = b /a

23else:24

break

#這一步不可能出現,只是為了方便看、理解

2526 st.push(c) #

將本次運算結果壓入棧

2728

if st.depth() == 1 #

如果棧裡面只有乙個元素,表示計算完成

29return

st.pop()

30raise syntaxerror

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

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

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

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

棧結構之後綴表示式

棧採用順序棧儲存,試設計演算法實現將表示式轉換成字尾表示式輸出。例如,輸入表示式 a b c d e f g 輸出其字尾表示式 abc de f g include include define true 1 define false 0 define ok 1 define error 0 def...