python-中綴轉換後綴並計算
阿新 • • 發佈:2019-04-04
erro odin elif 簡單 列表 運算符號 brush __init__ 但是
這個好像比較簡單。
前綴規則好像還沒有理清楚。
# coding = utf-8 class Stack: def __init__(self): self.items = [] # 是否為空 def is_empty(self): return self.items == [] # 進棧 def push(self, item): self.items.append(item) # 出棧 def pop(self): return self.items.pop() # 返回棧頂值,不改變棧 def peek(self): return self.items[len(self.items) - 1] # 返回棧長度 def size(self): return len(self.items) def infix_to_postfix(infix_expr): prec = dict() prec["*"] = 3 prec["/"] = 3 prec["+"] = 2 prec["-"] = 2 prec["("] = 1 prec[")"] = 1 postfix_expr = [] s = Stack() for item in infix_expr.split(): # 如果標記是操作數,將其附加到輸出列表的末尾 if item not in prec.keys(): postfix_expr.append(item) # 如果標記是左括號,將其壓到 s 上 elif item == ‘(‘: s.push(item) # 如果標記是右括號,則彈出 s,直到刪除相應的左括號。將每個運算符附加到 # 輸出列表的末尾 elif item == ‘)‘: while s.peek() != ‘(‘: postfix_expr.append(s.pop()) s.pop() # 如果標記是運算符, *,/,+ 或 - ,將其壓入 s。但是,首先刪除已經在 # s 中具有更高或相等優先級的任何運算符,並將它們加到輸出列表中 else: while (not s.is_empty()) and (prec[s.peek()] >= prec[item]): postfix_expr.append(s.pop()) s.push(item) print(s.items) # 當輸入表達式被完全處理時,檢查 s。仍然在棧上的任何運算符都可以刪除並加到 # 輸出列表的末尾 while not s.is_empty(): postfix_expr.append(s.pop()) return ‘ ‘.join(postfix_expr) def postfix_eval(postfix_expr): s = Stack() for item in postfix_expr.split(): # 如果不是運算符號,壓棧 if item not in ‘+-*/‘: s.push(item) else: # 如果是運算符號,取出棧上最近兩個數字進行運算 # 然後,再將結果壓回棧 op2 = int(s.pop()) op1 = int(s.pop()) print(op1, item, op2) result = do_match(item, op1, op2) s.push(result) print(s.items) return result # 運行結果 def do_match(op, op1, op2): if op == ‘+‘: return op1 + op2 elif op == ‘-‘: return op1 - op2 elif op == ‘*‘: return op1 * op2 elif op == ‘/‘: return op1 / op2 else: raise Exception(‘Error operation!‘) infix_str = ‘( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )‘ postfix_output = infix_to_postfix(infix_str) print(infix_str) print(postfix_output) postfix_result = postfix_eval(postfix_output) print(postfix_result)
輸出:顯示了棧的情況
C:\Users\Sahara\.virtualenvs\untitled\Scripts\python.exe D:/test/python_stack.py [‘(‘] [‘(‘] [‘(‘, ‘+‘] [‘(‘, ‘+‘] [] [‘*‘] [‘*‘] [‘-‘] [‘-‘] [‘-‘, ‘/‘] [‘-‘, ‘/‘, ‘(‘] [‘-‘, ‘/‘, ‘(‘] [‘-‘, ‘/‘, ‘(‘, ‘+‘] [‘-‘, ‘/‘, ‘(‘, ‘+‘] [‘-‘, ‘/‘, ‘(‘, ‘+‘, ‘*‘] [‘-‘, ‘/‘, ‘(‘, ‘+‘, ‘*‘] [‘-‘, ‘/‘, ‘(‘, ‘-‘] [‘-‘, ‘/‘, ‘(‘, ‘-‘] [‘-‘, ‘/‘] ( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 ) 23 2 + 5 * 280 4 11 6 * + 35 - / - [‘23‘] [‘23‘, ‘2‘] 23 + 2 [25] [25, ‘5‘] 25 * 5 [125] [125, ‘280‘] [125, ‘280‘, ‘4‘] [125, ‘280‘, ‘4‘, ‘11‘] [125, ‘280‘, ‘4‘, ‘11‘, ‘6‘] 11 * 6 [125, ‘280‘, ‘4‘, 66] 4 + 66 [125, ‘280‘, 70] [125, ‘280‘, 70, ‘35‘] 70 - 35 [125, ‘280‘, 35] 280 / 35 [125, 8.0] 125 - 8 [117] 117
python-中綴轉換後綴並計算