1、题目描述
基本计算器。
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
2、思路
本人也不太会,看的这个人的讲解视频:bibili.
代码
class Solution:
def calculate(self, s: str) -> int:
ret = 0 # 记录结果
num = 0 # 记录当前数字
sign = 1 # 记录当前符号
for char in s:
# 如果碰到数字:比如134,则不断更新num的数值
if char<= '9' and char >= '0':
num = num*10 + int(char)
# 如果碰到加号或者减号,则更新一遍ret,同时将符号位和num重置;
elif char == '+':
ret = ret + num*sign
sign = 1
num = 0
elif char == '-':
ret = ret + num*sign
sign = -1
num = 0
return ret+num*sign
括号
若包含括号,则需要用到栈:
class Solution:
def calculate(self, s: str) -> int:
ret = 0 # 记录结果
num = 0 # 记录当前数字
sign = 1 # 记录当前符号
stack = [] # 记录括号
for char in s:
# 如果碰到数字:比如134,则不断更新num的数值
if char<= '9' and char >= '0':
num = num*10 + int(char)
# 如果碰到加号或者减号,则更新一遍ret,同时将符号位和num重置;
elif char == '+':
ret = ret + num*sign
sign = 1
num = 0
elif char == '-':
ret = ret + num*sign
sign = -1
num = 0
# 若碰到左括号,则入栈res和当前符号:
elif char == '(':
stack.append(ret)
stack.append(sign)
num = 0
sign = 1
ret = 0 # 千万记得这里吧ret也需要置为0,否则就累加了。
elif char == ')':
ret = ret + num*sign
num = 0
sign = 1
# 更新ret的符号位
ret *= stack[-1]
stack.pop()
# 更新ret的值
ret += stack[-1]
stack.pop()
return ret+num*sign # 返回最终的值