對於我們日常數學應用中最常用的中綴表達式,它其實是最複雜的一種計算方式,它增加了各種優先級運算符等,使表達式不簡單;其實還有其他兩種數學表達式,前綴表達式和後綴表達式。
它們的實例以及計算方式如下:
實例相關的中綴表達式:(3 - 5)* (6 + 17 * 4) / 3
- 前綴表達式:
實例:/ * - 3 5 + 6 * 17 4 3
計算方式:前綴表達式由右往左就算,每次遇到運算符就取離該運算符最進的兩個數進行運算符計算然後將結果填入計算後的位置。 - 後綴表達式:
實例:3 5 - 6 17 4 * + * 3 /
計算方式:後綴表達式從左往右計算, 每次遇到運算符就取離該運算符最近的兩個數進行運算符計算,然後填入
知道了計算方式,我們來講一下如何用python實現後綴表達式的計算。
我們用棧的方式實現對後綴表達式的計算,遇到數字就壓入棧,遇到運算符就取出棧頂兩個數進行運算符運算並且將結果壓入棧中。
爲此,我們要爲之前順序表實現棧的代碼中加入一個方法,取出棧頂兩個元素,如下代碼:
def getFirstTwo(self):
if len(self._elem) < 2:
raise StackOverFlow("棧中少於兩個元素")
return self._elem.pop(), self._elem.pop()
# 返回的元素就是棧頂的兩個元素
具體的實現方法如下:
# _*_ coding: utf-8 _*_
from 棧的順序表實現 import Stack
S = Stack()
# 創建一個用於存儲數的棧
def suffix_exp_cul(suffixExpression):
a = suffixExpression.split(' ')
# 由於我們輸入的是一個字符串,而且字符串的每個符號之間都有空格
for i in a:
try:
num = int(i)
S.push(num)
except ValueError:
culNums = S.getFirstTwo()
x, y = culNums[1], culNums[0]
if i == '/':
newNum = x / y
elif i == '*':
newNum = x * y
elif i == '+':
newNum = x + y
else:
newNum = x - y
S.push(newNum)
continue
if S.is_empty():
return newNum
else:
raise ValueError
# 如果結束時棧不爲空,說明輸入的後綴表達式有問題
def suffix_exp_calculate():
# 定義一個交互環境,用於輸入後綴表達式
x = 1
while True:
try:
if x == 1:
line = input("請輸入您要計算的後綴表達式(每個字符中間留空格)(按done退出):")
x = 2
else:
line = input("輸入有誤,請重新輸入您要計算的後綴表達式(每個字符中間留空格)(按done退出):")
if line == 'done':
break
end = suffix_exp_cul(line)
print("你的表達式結果爲:", end)
except ValueError:
continue
suffix_exp_calculate()
由於不考慮符號這樣的一元運算符,這裏的實現還是比較簡單的。如果要考慮一元運算符的話,那就比較複雜了,嗯~~~~~~~~~~~