中綴表達式轉后綴表達式
中綴表達式轉后綴表達式的規則:
1.遇到操作數,直接輸出;
2.棧為空時,遇到運算符,入棧;
3.遇到左括號,將其入棧;
4.遇到右括號,執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出;
5.遇到其他運算符’+”-”*”/’時,彈出所有優先級大於或等於該運算符的棧頂元素,然后將該運算符入棧;
6.最終將棧中的元素依次出棧,輸出。
經過上面的步驟,得到的輸出既是轉換得到的后綴表達式。
代碼實現:
expression = "3+(6*7-2)+2*3" def middle2behind(expresssion): result = [] # 結果列表 stack = [] # 棧 for item in expression: if item.isnumeric(): # 如果當前字符為數字那么直接放入結果列表 result.append(item) else: # 如果當前字符為一切其他操作符 if len(stack) == 0: # 如果棧空,直接入棧 stack.append(item) elif item in '*/(': # 如果當前字符為*/(,直接入棧 stack.append(item) elif item == ')': # 如果右括號則全部彈出(碰到左括號停止) t = stack.pop() while t != '(': result.append(t) t = stack.pop() # 如果當前字符為加減且棧頂為乘除,則開始彈出 elif item in '+-' and stack[len(stack)-1] in '*/': if stack.count('(') == 0: # 如果有左括號,彈到左括號為止 while stack: result.append(stack.pop()) else: # 如果沒有左括號,彈出所有 t = stack.pop() while t != '(': result.append(t) t = stack.pop() stack.append('(') stack.append(item) # 彈出操作完成后將‘+-’入棧 else: stack.append(item)# 其余情況直接入棧(如當前字符為+,棧頂為+-) # 表達式遍歷完了,但是棧中還有操作符不滿足彈出條件,把棧中的東西全部彈出 while stack: result.append(stack.pop()) # 返回字符串 return "".join(result) print(middle2behind(expression))
