Skip to content

Commit

Permalink
Create basic-calculator-iii.py
Browse files Browse the repository at this point in the history
  • Loading branch information
kamyu104 authored Jan 23, 2018
1 parent 18f39a3 commit a4383f0
Showing 1 changed file with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions Python/basic-calculator-iii.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Time: O(n)
# Space: O(n)

class Solution(object):
def calculate(self, s):
"""
:type s: str
:rtype: int
"""
operands, operators = [], []
operand = ""
for i in reversed(xrange(len(s))):
if s[i].isdigit():
operand += s[i]
if i == 0 or not s[i-1].isdigit():
operands.append(int(operand[::-1]))
operand = ""
elif s[i] == ')' or s[i] == '*' or s[i] == '/':
operators.append(s[i])
elif s[i] == '+' or s[i] == '-':
while operators and \
(operators[-1] == '*' or operators[-1] == '/'):
self.compute(operands, operators)
operators.append(s[i])
elif s[i] == '(':
while operators[-1] != ')':
self.compute(operands, operators)
operators.pop()

while operators:
self.compute(operands, operators)

return operands[-1]

def compute(self, operands, operators):
left, right = operands.pop(), operands.pop()
op = operators.pop()
if op == '+':
operands.append(left + right)
elif op == '-':
operands.append(left - right)
elif op == '*':
operands.append(left * right)
elif op == '/':
operands.append(left / right)

0 comments on commit a4383f0

Please sign in to comment.