文章目录
- 1、题目描述
- 2、思路
- 代码
- 括号
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 = 0elif char == '-':ret = ret + num*sign sign = -1num = 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 = 0elif char == '-':ret = ret + num*sign sign = -1num = 0 # 若碰到左括号,则入栈res和当前符号:elif char == '(':stack.append(ret)stack.append(sign)num = 0sign = 1 ret = 0 # 千万记得这里吧ret也需要置为0,否则就累加了。elif char == ')':ret = ret + num*signnum = 0 sign = 1# 更新ret的符号位ret *= stack[-1]stack.pop()# 更新ret的值ret += stack[-1]stack.pop()return ret+num*sign # 返回最终的值