python實現中綴表示式轉化為字尾表示式求值

2021-08-18 18:12:19 字數 1602 閱讀 8760

# 運算子優先

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...