Skip to content

Instantly share code, notes, and snippets.

@Bennyelg
Last active June 27, 2017 22:55
Show Gist options
  • Save Bennyelg/deb860ff34026e07ea3a3b986eebe99a to your computer and use it in GitHub Desktop.
Save Bennyelg/deb860ff34026e07ea3a3b986eebe99a to your computer and use it in GitHub Desktop.
from decimal import Decimal
def apply_high_order(ind, element, expression_elements):
if element in ("*", "/"):
if element == "*":
evaluated_num = str(float(expression_elements[ind - 1]) * float(expression_elements[ind + 1]))
else:
evaluated_num = str(float(expression_elements[ind - 1]) / float(expression_elements[ind + 1]))
expression_elements = expression_elements[:ind - 1] + [evaluated_num] + expression_elements[ind + 2:]
elif element == "(":
if expression_elements[ind + 2] == "+":
evaluated_num = str(float(expression_elements[ind + 1]) + float(expression_elements[ind + 3]))
elif expression_elements[ind + 2] == "-":
evaluated_num = str(float(expression_elements[ind + 1]) - float(expression_elements[ind + 3]))
elif expression_elements[ind + 2] == "*":
evaluated_num = str(float(expression_elements[ind + 1]) * float(expression_elements[ind + 3]))
elif expression_elements[ind + 2] == "/":
evaluated_num = str(float(expression_elements[ind + 1]) / float(expression_elements[ind + 3]))
expression_elements = expression_elements[:ind] + [evaluated_num] + expression_elements[ind + 5:]
return expression_elements
def calc(expression):
expression_elements = expression.split(" ")
while "*" in expression_elements or "/" in expression_elements or "(" in expression_elements:
for ind, element in enumerate(expression_elements):
if element in ("(", "*", "/"):
expression_elements = apply_high_order(ind, element, expression_elements)
break
operators = []
for element in expression_elements:
try:
float(element)
except:
operators.append(element)
expression_elements.remove(element)
expression_elements.reverse()
operators.reverse()
while len(expression_elements) != 1:
ln = len(expression_elements)
a = expression_elements.pop()
b = expression_elements.pop()
opr = operators.pop()
if opr == "+":
print("{}{}{}".format(a, "+", b))
expression_elements.append(str(Decimal(a) + Decimal(b)))
print expression_elements
else:
print("{}{}{}".format(a, "-", b))
expression_elements.append(str(Decimal(a) - Decimal(b)))
return expression_elements[0]
# example:
# calc("( 5 + 5 ) * 2 + 10 * 2")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment