实现简易计算器

用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))

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容