Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open (
and closing parentheses )
, the plus +
or minus sign -
, non-negative integers and empty spaces .
The expression string contains only non-negative integers, +
, -
, *
, /
operators , open (
and closing parentheses )
and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid. All intermediate results will be in the range of [-2147483648, 2147483647]
.
Some examples:
"1 + 1" = 2 " 6-4 / 2 " = 4 "2*(5+5*2)/3+(6/2+8)" = 21 "(2+6* 3+5- (3*14/7+2)*5)+3"=-12
Note: Do not use the eval
built-in library function.
My Python Solution by referring to Grandyang‘s post: https://www.cnblogs.com/grandyang/p/8873471.html
1 class Solution: 2 def getRes(self, resSoFar, sign, num): 3 if sign == ‘+‘: 4 return resSoFar + num 5 elif sign == ‘-‘: 6 return resSoFar - num 7 elif sign == ‘*‘: 8 return resSoFar * num 9 elif sign == ‘/‘: 10 return int(resSoFar / num) 11 12 def calculate(self, s: str) -> int: 13 sign = ‘+‘ # store the previous sign 14 num = 0 # store current num passed 15 resCur = 0 # store current res from "*/" operations 16 res = 0 # store the global result 17 n = len(s) 18 i = 0 19 while i < n: 20 ch = s[i] 21 if ch.isdigit(): # get current number 22 num = num*10 + int(ch) 23 elif ch == ‘(‘: # start the left parenthesis 24 cnt = 1 25 j = i + 1 26 while j < n: 27 if s[j] == ‘(‘: 28 cnt += 1 29 elif s[j] == ‘)‘: 30 cnt -= 1 31 if cnt == 0: # closing right parenthesis just passed 32 num = self.calculate(s[i+1:j]) # update num or resCur? 33 break # 这个break不能忘了! 34 j += 1 35 i = j 36 # 下面这个Trick(用if而不是用elif) 非常重要,否则 i==n-1 下不来! 37 if ch in "+-*/" or i == n - 1: # Take action - process previous number and sign 38 resCur = self.getRes(resCur, sign, num) # get current result by combining resCur and num # -4, -2 39 if ch in "+-" or i == n - 1: # collapse the local w/ the global result iff it‘s "+-" and i==n-1 40 res += resCur # 6 - 4 41 resCur = 0 42 sign = ch 43 num = 0 44 i += 1 45 46 return res
原文地址:https://www.cnblogs.com/uicoder/p/10468689.html
时间: 2024-10-07 04:12:41