解决思路
- 首先是遍历处理,将数字和符合提取出来,写入栈中
- 对于乘除运算符先将栈中最后一位弹出运算后再将结果压入
- 对于括号进行递归处理,获取括号内字符串,调用自身得到值
class Solution:
def calculate(self, character_string):
str_len = len(character_string)
# 存取部分数据和
stack = []
preSign = '+'
num = 0
i = 0
while i < str_len: # 以i为计数器遍历字符串
char = character_string[i]
if char == ' ': # 跳过空格
i = i + 1
continue
if char.isdigit(): # 如果是数字
num = num * 10 + int(char)
# 如果遇到左括号,递归求出括号内表达式的值
if char == '(':
j = i + 1
counts = 1
# 截取出括号表达式的值
while counts > 0:
# 这个地方很巧妙,利用counts来成对的取出括号里的表达式
if character_string[j] == "(":
counts = counts + 1
if character_string[j] == ")":
counts = counts - 1
j = j + 1
# 剥去一层括号,求括号内表达式的值
num = self.calculate(character_string[i + 1:j - 1])
i = j - 1
if not char.isdigit() or i == str_len - 1:
if preSign == "+":
stack.append(num)
elif preSign == "-":
stack.append(-1 * num)
elif preSign == "*":
tmp = stack.pop()
stack.append(tmp * num)
num = 0
preSign = char
i = i + 1
return sum(stack)
if __name__ == "__main__":
s = Solution()
print(s.calculate("(3+4)*(5+(2-3))"))
# return
28