四則運算 python

2021-09-25 23:21:35 字數 1801 閱讀 4964

中綴表示式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 - 1 ) * 3 + 10 / 2" #空格隔開,括號注意中英文不要亂

print(calac_houzhui(change_houzhui(s)))

python四則運算程式 四則運算(Python)

四則運算程式 一 資訊 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 程式要求能處理使用者的輸入,判斷對錯,累積分數 程式支援可以由使用者自行選擇加 減 乘 除運算 三 import random...

四則運算(Python)

四則運算程式 一 資訊 部落格班級 作業要求 作業目標 完成四則運算的基本內容 學號3190704135 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 1除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 2程式要求能處理使用者的輸入,判斷對錯,累...

四則運算(Python)

部落格班級 作業要求 homework 11376 作業目標 寫乙個能自動生成小學四則運算題目的程式 學號 3190704132 如下 def szys sym f random.randint 0,3 n1 random.randint 1,20 n2 random.randint 1,20 re...