参考:labuladong: 通过层层拆解问题,实现一个带括号的四则运算计算器
🚀Final Goal:
- 输入一个合法运算表达式字符串,包含
+
. -
, *
, /
, (
, )
, 数字
, 空格
;输出运算结果
- 要符合通常的运算法则,即括号优先,先乘除后加减
- 除号是整数除法,无论正负都向 0 取整(5/2=2,-5/2=-2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| s = '1 - 42 + 3 + 3 * 7' def calculator(s): stack = [] sign = '+' num = 0 for i in range(len(s)): c = s[i] if c.isdigit(): num = 10*num + int(c) if c == ' ': continue if not c.isdigit() or i == len(s) - 1: if sign == '+': stack.append(num) elif sign == '-': stack.append(-num) elif sign == '*': top = stack.pop() stack.append(top*num) elif sign == '/': top = stack.pop() stack.append(int(top/num)) num = 0 sign = c
return sum(stack) calculator(s)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
def calculate(s: str) -> int:
def helper(s) -> int: stack = [] sign = '+' num = 0
while len(s) > 0: c = s.pop(0) if c.isdigit(): num = 10 * num + int(c) if c == '(': num = helper(s)
if (not c.isdigit() and c != ' ') or len(s) == 0: if sign == '+': stack.append(num) elif sign == '-': stack.append(-num) elif sign == '*': top = stack.pop() stack.append(top*num) elif sign == '/': top = stack.pop() stack.append(int(top/num)) num = 0 sign = c if c == ')': break return sum(stack)
return helper(list(s)) s = '1 - ((2 * (4 + 3) - 44) / 4)' calculate(s)
|
目标:尝试加一个栈写出迭代形式: