用python实现一个简易四则运算器,不考虑括号。
import re
def split_expression(expression):
# 使用正则表达式分割字符串,匹配一个或多个数字为一个组,一个或一个以上的加减乘除符号为一个组
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',分割成以数字和符号为元素的列表l,如'1+2*3'分割为['1', '+', '2', '*', '3']
# 3. 两两读取l的元素[n,o],并根据o进行操作:
# 3.1 如果o是'+/-',如果D不为空,则将n压入D,计算D的积得到结果,并清空D,并将结果与o压入S;否则将n与o压入S;
# 3.2 如果o是'*'或'/',如果D不为空,则将n压入D,计算D的积得到结果,并清空D,并将结果与o压入D;否则将n与o压入D;
# 3.3 读取最后一个数字,如果D不为空,则将其压入D,计算D的积得到结果,并将结果压入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]))
# 测试函数
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))