用python實現(xiàn)一個簡易四則運算器奕锌,不考慮括號。
import re
def split_expression(expression):
? ? # 使用正則表達式分割字符串德澈,匹配一個或多個數(shù)字為一個組歇攻,一個或一個以上的加減乘除符號為一個組
? ? return re.findall(r"\d+\.\d+|\d+|[+\-*/]", expression)
def calcu_one(a: float, op: str, b: float) -> float:
? ? if op == "+":
? ? ? ? return a + b
? ? elif op == "-":
? ? ? ? return a - b
? ? elif op == "*":
? ? ? ? return a * b
? ? elif op == "/":
? ? ? ? if b == 0:
? ? ? ? ? ? raise ValueError("division by zero")
? ? ? ? return a / b
? ? else:
? ? ? ? print(a, b, op)
? ? ? ? raise ValueError("Invalid operator: " + op)
def calcu(expression: str) -> float:
? ? # 1. 加減棧和乘除棧,分別記為S和D
? ? # 2. 讀入表達式s梆造,如果以'-'開頭則開頭加上'0'缴守,分割成以數(shù)字和符號為元素的列表l,如'1+2*3'分割為['1', '+', '2', '*', '3']
? ? # 3. 兩兩讀取l的元素[n,o]镇辉,并根據(jù)o進行操作:
? ? # ? 3.1 如果o是'+/-'屡穗,如果D不為空,則將n壓入D忽肛,計算D的積得到結(jié)果村砂,并清空D,并將結(jié)果與o壓入S屹逛;否則將n與o壓入S础废;
? ? # ? 3.2 如果o是'*'或'/',如果D不為空罕模,則將n壓入D评腺,計算D的積得到結(jié)果,并清空D淑掌,并將結(jié)果與o壓入D蒿讥;否則將n與o壓入D;
? ? # ? 3.3 讀取最后一個數(shù)字,如果D不為空芋绸,則將其壓入D媒殉,計算D的積得到結(jié)果,并將結(jié)果壓入S摔敛;否則將其壓入S廷蓉;
? ? # 4. 返回S的和
? ? if expression.startswith("-"):
? ? ? ? expression = "0" + expression
? ? S = []
? ? D = []
? ? items = split_expression(expression)
? ? i = 0
? ? while i < len(items) - 2:
? ? ? ? n = items[i]
? ? ? ? o = items[i + 1]
? ? ? ? if o in ["+", "-"]:
? ? ? ? ? ? if D:
? ? ? ? ? ? ? ? n = calcu_one(float(D[0]), D[1], float(n))
? ? ? ? ? ? ? ? D = []
? ? ? ? ? ? S.extend([n, o])
? ? ? ? elif o in ["*", "/"]:
? ? ? ? ? ? if D:
? ? ? ? ? ? ? ? n = calcu_one(float(D[0]), D[1], float(n))
? ? ? ? ? ? D = [n, o]
? ? ? ? i += 2
? ? if D:
? ? ? ? S.append(calcu_one(float(D[0]), D[1], float(items[-1])))
? ? else:
? ? ? ? S.append(items[-1])
? ? res = S[0]
? ? for i in range(1, len(S), 2):
? ? ? ? res = calcu_one(float(res), S[i], float(S[i + 1]))
? ? return res
if __name__ == "__main__":
? ? # print(qsort([1, 2, 4, 3, -1, 100, -200, 300]))
? ? # 測試函數(shù)
? ? expressions = [
? ? ? ? "3+2-5*8",
? ? ? ? "9/3+2",
? ? ? ? "10 - 5",
? ? ? ? "3 * 4 + 2",
? ? ? ? "3 / 2",
? ? ? ? "123.444 + 456.0 - 789 * 0",
? ? ]
? ? for expression in expressions:
? ? ? ? print(expression, "=", calcu(expression))