首先了解一下棧:
棧是限定僅在表尾進行插入和刪除操作的線性表。允許插入與刪除的一段叫做棧頂,另一端
叫做棧底,不含任何資料元素的棧稱為空棧。棧又稱為後進先出(last in first out)的線性
表,簡稱lifo結構。
在python中,可以用列表來實現棧:
lt = [3]
#相當於壓棧
print(lt)
>>>[3,4]
#相當於彈棧
lt.pop()
print(lt)
>>>[3]
利用棧這種資料結構我們可以實現四則運算。首先,我們來了解一些名詞:
中綴表示式:我們再平常寫的四則運算表示式就叫做中綴表示式,運算子位於數字中間,例如:
9+3*(2+1)
字尾表示式:將運算子寫到數字後面的式子叫做字尾表示式,對於上面的例子來說:
中綴表示式轉為字尾表示式思路9+3*(2+1):
設立乙個運算子棧和字尾表示式棧;
第乙個元素為數字9,加入字尾表示式棧:9;
第二個元素為運算子「 + 」,加入到運算子棧:+;
第三個元素為數字3,字尾表示式棧:9 3;
第四個元素為運算子「 * 」,由於 「 * 」 的優先順序大於棧頂元素 +,所以將其加入到運算子棧中:+ *;
第五個元素為「 ( 」,加入到運算子棧中:+ * (;
第六個元素為數字2,字尾表示式棧:9 3 2;
第七個元素為運算子「 + 」,加入到運算子棧:+ * ( +;
第八個元素為數字1,字尾表示式棧:9 3 2 1;
第九個元素為「 ) 」,並且由於這是最後乙個元素,運算子棧開始彈出,並
加入到字尾表示式棧中:9 3 2 1 + * +
字尾表示式寫出來後,又該怎樣去計算呢?我們可以發現,當遍歷字尾表示式時,可以將數字元素加入到乙個新棧,然後遇到乙個運算子就彈出兩個數字進行運算,將值壓棧,直到最後乙個元素為止,這樣新棧中的值就是運算結果.
**:
# 轉為字尾表示式.運算表示式元素之間用空格隔開:
def change_houzhui(s):
result = # 結果列表
stack = # 棧
s_lt = s.split(' ')
for item in s_lt:
if item.isnumeric(): # 如果當前字元為數字那麼直接放入結果列表
else: # 如果當前字元為一切其他操作符
if len(stack) == 0: # 如果棧空,直接入棧
elif item in '*/(': # 如果當前字元為*/(,直接入棧
elif item == ')': # 如果右括號則全部彈出(碰到左括號停止)
t = stack.pop()
while t != '(':
t = stack.pop()
# 如果當前字元為加減且棧頂為乘除,則開始彈出
elif item in '+-' and stack[-1] in '*/':
if stack.count('(') == 0: # 如果沒有左括號,彈出所有
while stack:
else: # 如果有左括號,彈到左括號為止
t = stack.pop()
while t != '(':
t = stack.pop()
else:
# 表示式遍歷完了,但是棧中還有操作符不滿足彈出條件,把棧中的東西全部彈出
while stack:
# 返回字串
return result
#字尾表示式進行計算
def calac_houzhui(follow):
num =
base_opt = ['+', '-', '*', '/']
for j in follow:
if j.isdigit():
if j in base_opt:
num2 = num.pop()
num1 = num.pop()
if j == "+":
elif j == "-":
elif j == "*":
else:
return num
if __name__ == '__main__':
s = "9 + 3 * ( 2 + 1 )" #空格隔開,括號注意中英文不要亂
print(calac_houzhui(change_houzhui(s)))
>>>[18]
python四則運算程式 四則運算(Python)
四則運算程式 一 資訊 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 程式要求能處理使用者的輸入,判斷對錯,累積分數 程式支援可以由使用者自行選擇加 減 乘 除運算 三 import random...
四則運算 python
中綴表示式9 3 2 1 轉為字尾表示式思路9 3 2 1 設立乙個運算子棧和字尾表示式棧 第乙個元素為數字9,加入字尾表示式棧 9 第二個元素為運算子 加入到運算子棧 第三個元素為數字3,字尾表示式棧 9 3 第四個元素為運算子 由於 的優先順序大於棧頂元素 所以將其加入到運算子棧中 第五個元素為...
四則運算(Python)
四則運算程式 一 資訊 部落格班級 作業要求 作業目標 完成四則運算的基本內容 學號3190704135 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 1除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 2程式要求能處理使用者的輸入,判斷對錯,累...