赞
踩
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = “1 + 1”
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23
模拟!开始!
例子:s = “(1+(4+5+2)-3)+(6+8)”
先设几个变量,别问为什么,先记就行。
1.变量res,记录当前括号里的内容总和。比如(4+5+2) 那总和就是res=11
2.变量num,记录当前整体数字,因为要遍历s,所以如果有152+1 这种,那么遍历的指针就应该是1,5,2,+,1。 然而152是一个数字整体,所以需要有一个num变量来应对这种情况。
3.变量sign,一个符号变量,1表示为加号,-1表示为减号。
4.变量stack。是个栈,存什么后面再说。
操作的步骤是:
模拟过程:
例子:s = “(1+(4+5+2)-3)+(6+8)”
初始化:
res = 0
sign = 1
num = 0
其实这个初始化方法,可以理解成 s = 0+(1+(4+5+2)-3)+(6+8),在最前面多了一个0+
res *= stack.pop(),res += stack.pop()
class Solution:
def calculate(self, s: str) -> int:
stack = []
res = 0 # 记录当前括号内的总值
num = 0 # 记录当前值的整体(比如156这种多位数)
sign = 1 # 记录符号 1为正好, -1 为负号
for c in s:
if c.isdigit(): # 为数字的情况
num = num*10 + int(c)
elif c in '+-': # 正负号的情况
res+= sign* num
num = 0
sign = 1 if c =='+' else -1
elif c =='(': # 左括号的情况,进入了一个新的更深的嵌套
stack.append(res)
stack.append(sign)
res = 0
sign = 1
elif c == ')': # 退出了当前嵌套
res +=sign*num
res *=stack.pop()
res +=stack.pop()
num = 0
res += num* sign
return res
```
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。