# 運算子優先
ops_rule =
def middle_to_after(s):
"""中綴表示式變為字尾表示式"""
expression =
ops =
for item in s:
# 當遇到運算子
if item in ['+', '-', '*', '/',"^"]:
while len(ops) >= 0:
# 如果棧中沒有運算子,直接將運算子新增到字尾表示式
if len(ops) == 0:
break
# 如果棧中有運算子
op = ops.pop()
# 如果棧頂的運算子比當前運算子級別低,當前運算子入棧
if op == '(' or ops_rule[item] > ops_rule[op]:
break
else:
# 如果棧頂的運算子比當前運算子級別高,將棧頂運算子加入到表示式
# 當前運算子與棧中後面的運算子比較
# 遇到左括號入棧
elif item == '(':
# 遇到右括號,將棧中運算子加入到表示式直到遇到左括號
elif item == ')':
while len(ops) > 0:
op = ops.pop()
if op == '(':
break
else:
# 遇到運算數,新增到表示式
else:
# 最好將棧中全部運算子加到字尾表示式中
while len(ops) > 0:
return expression
def expression_to_value(expression):
"""字尾表示式計算"""
stack_value =
for item in expression:
if item in ['+', '-', '*', '/','^']:
n2 = stack_value.pop()
n1 = stack_value.pop()
result = cal(n1, n2, item)
else:
return stack_value[0]
# 計算函式
def cal(n1, n2, op):
if op == '+':
return n1 + n2
if op == '-':
return n1 - n2
if op == '*':
return n1 * n2
if op == '/':
return n1 // n2
if op == '^':
return n1**n2
if __name__ == '__main__':
exp = input().split()
expression = middle_to_after(exp)
value = expression_to_value(expression)
print(value)
中綴表示式轉化為字尾表示式
注意 中綴表示式需要空格隔開運算元或者操作符 關鍵有 判斷是否操作符,操作符優先順序 public class profixexpression 計算排好的字尾操作計算式 param prostr return public static intprofixcalculate string pros...
中綴表示式轉化為字尾表示式
中綴表示式轉化為字尾表示式有兩種方法,一種是利用棧,一種是把表示式轉化為樹再進一步求解,今天我們來深入了解一下這兩種方法 給出下面乙個例子 我們把中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 1.首先初始化乙個空棧,用來對符號進出棧使用 2.第乙個字元是數字9,輸出9,將後面的符號 進棧 ...
中綴表示式轉化為字尾表示式
中綴表示式轉化為字尾表示式 例如 1 2 3 4 7 5 123 4 75 1 遇到數字輸出,否則進棧。2 遇到有右括號匹配棧裡的左括號,輸出棧裡的內容 3 遇到比自己比棧裡的運算子優先順序高,入棧 4 遇到比自己比棧裡的運算子優先順序低,將棧裡的運算子出棧 include include incl...