题解 | 四则运算
四则运算
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('旧','新'):将字符串中旧的替换为新的
查看14道真题和解析