题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

d = input().strip()

expression = []

oprs = []
nums = []

ops = {
    "*": lambda x, y: x * y,
    "/": lambda x, y: x / y,
    "-": lambda x, y: x - y,
    "+": lambda x, y: x + y,
}


def recursive(expression: list[str], start: int):
    i = start
    oprs = []
    nums = []
    while i < len(expression):
        cur = expression[i]
        if cur.isnumeric():
            nums.append(int(cur))
            i += 1
        elif cur in "+":
            oprs.append(cur)
            i += 1
        elif cur == "-":
            if nums:
                oprs.append("+")
            if expression[i + 1].isnumeric():
                nums.append(int(cur + expression[i + 1]))
                i += 2
            else:
                r, step = recursive(expression, i + 2)
                i = step
                nums.append(-r)
        elif cur == '(':
            r, step = recursive(expression, i + 1)
            nums.append(r)
            i = step
        elif cur == ")":
            while oprs:
                o = oprs.pop()
                num1 = nums.pop()
                num2 = nums.pop()
                r = ops[o](num2, num1)
                nums.append(r)
            return nums[0], i + 1
        elif cur in "*/":
            nxt = expression[i + 1]
            i += 1
            if nxt.isnumeric():
                num = nums.pop()
                r = ops[cur](num, int(nxt))
                nums.append(r)
                i += 1
            else:
                oprs.append(cur)
    while oprs:
        o = oprs.pop()
        num1 = nums.pop()
        num2 = nums.pop()
        r = ops[o](num2, num1)
        nums.append(r)

    return nums[0], len(expression) - 1


i = 0
while i < len(d):
    if d[i].isnumeric():
        temp = d[i]
        is_break = False
        for j in range(i + 1, len(d)):
            if d[j].isnumeric():
                temp += d[j]
            else:
                expression.append(temp)
                is_break = True
                i = j
                break
        if not is_break:
            i += 1
            expression.append(temp)
    else:
        expression.append(d[i])
        i += 1

r, _ = recursive(expression, 0)
print(r)

全部评论

相关推荐

02-25 13:02
中南大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务