Basic Calculator

227. Basic Calculator II

Jimmy (xiaoke) Shen
1 min readApr 5, 2020

A naive implementation.

For example, if we have ‘3+2*2/2+4’

  • put numbers and operation into a list, which will be [3, ’+’, 2, ’*’ , 2, ’/’, 2, ’+’, 4]
  • Evaluate ‘*’ and ‘/’ the first round: [3, ’+’, 2, ‘+’, 4]
  • Evaluate ‘+’, ‘-’ the second round.
class Solution:
def calculate(self, s: str) -> int:
s = s.replace(" ","")
nums = []
num, operation="",""
for c in s:
if c.isdigit():
num+=c
else:
if num:
nums.append(int(num))
num=""
nums.append(c)
nums.append(int(num))
#print(nums)
i = 0
# 1) evaluate the '*' and '/' firstly
while i<len(nums):
c = nums[i]
if c=='*':
res = nums[i-1]*nums[i+1]
#print("res", res)
nums = nums[:i-1]+[res]+nums[i+2:]
#print("nums",nums)
elif c=='/':
res = nums[i-1]//nums[i+1]
nums = nums[:i-1]+[res]+nums[i+2:]
else:
i+=1
res = nums[0]
# 2) evaluate the '+' and '-'
for i, c in enumerate(nums):
if c=='+':
res +=nums[i+1]
elif c=='-':
res -= nums[i+1]

return res

A concise code from here

class Solution:
def calculate(self, s: str) -> int:
s = s.replace(" ","")
num, stack, operation = 0, [], "+"
for i in range(len(s)):
if s[i].isdigit():
num = num * 10 + int(s[i])
if s[i] in "+-*/" or i == len(s) - 1:
if operation == "+":
stack.append(num)
elif operation == "-":
stack.append(-num)
elif operation == "*":
stack.append(stack.pop()*num)
else:
stack.append(int(stack.pop()/num))
num = 0
operation = s[i]
return sum(stack)

Coding tips negative number // can surprise you.

>>> -3//2
-2
>>> -3/2
-1.5
>>> int(-3/2)
-1

--

--

No responses yet