题解 | 四则运算

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

def caculate(s,i):
    """输入一个运算式字符串s,从索引index开始计算"""
    """局部变量,仅在当前函数层级有效"""
    stack = []  # 用来存放数字
    pre_op = '+'    # 默认前置运算符为加
    num = 0

    while i < len(s):
        char = s[i]
        # 1.读到的是数字
        if char.isdigit():
            num = num * 10 + int(char)
        # 2.读到左括号,调用递归,何时返回括号内的值?又在何时压栈?
        if char == '(':
            num,i = caculate(s,i+1)
        # 3.读取完一个num,即读到运算符或字符串尾或读到右括号时,压栈
        if char in '+-*/' or i == len(s)-1 or char == ')':
            if pre_op == '+':
                stack.append(num)
            elif pre_op == '-':
                stack.append(-num)
            elif pre_op == '*':
                stack.append(stack.pop() * num)
            elif pre_op == '/':
                stack.append(stack.pop() / num)
            # 读到右括号,跳出循环,返回值,不重置num也不记录当前char!!!
            if char == ')':
                break
            # 压栈完成后,num重置,记录当前运算符
            num = 0
            pre_op = char
        i += 1
    return sum(stack),i

raw_s = input()
s = raw_s.replace('{','(').replace('}',')').replace('[','(').replace(']',')')
res,_ = caculate(s,0)
print(int(res))


1.使用栈储存num

2.读取到左括号时调用递归

3.(最重要)每个num前都有一个符号,在读取完一个num后根据这个num前的符号判断是直接压栈还是弹出栈顶元素并计算后压栈

4.压栈判断条件:

1)读取到运算符

2)读取到字符串的尾部

3)读取到右括号

5.压栈后,重置num,记录运算符

.isdigit():判断是否是数字

.replace('旧','新'):将字符串中旧的替换为新的

全部评论

相关推荐

03-31 00:39
门头沟学院 C++
南岗痞子:不还有俩没结束吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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