Infix to Postfix Expression Evaluater
Examples:
input: 10 + 2 * 8 - 3
output: 23
input: 10 - 2 ^ 8 * 3
output: -758Last updated
Examples:
input: 10 + 2 * 8 - 3
output: 23
input: 10 - 2 ^ 8 * 3
output: -758Last updated
import operator as op
class SimpleExpressionEval:
def __init__(self, expression):
# PEMDAS - paren, exp, mult, div, add, sub - define the operator priorities
self.ops = {'^': 3, '*': 2, '/': 2, '+': 1, '-': 1}
self.expression = expression
def eval_expression(self):
# infix to postfix to answer
postfix = self._infix_to_postfix()
return self.postfix_to_ans(postfix)
def _infix_to_postfix(self):
s = []
str_builder = []
tokens = self.expression.split(' ')
for token in tokens:
if token in self.ops:
# pop until top of s has lower priority or is empty
while s and self.ops[s[-1]] >= self.ops[token]:
str_builder.append(s[-1])
s.pop()
s.append(token)
else:
str_builder.append(token)
while s:
str_builder.append(s[-1])
s.pop()
return ' '.join(str_builder)
def postfix_to_ans(self, postfix):
s = []
map_op = {'+': op.add, '-': op.sub, '*': op.mul, '/': op.truediv, '^': op.pow}
tokens = postfix.split(' ')
for token in tokens:
if token in self.ops:
num1 = s[-1]
s.pop()
num2 = s[-1]
s.pop()
s.append(map_op[token](int(num2), int(num1)))
else:
s.append(token)
return s[-1]
obj = SimpleExpressionEval("10 + 2 * 8 - 3")
print(obj.eval_expression())
obj2 = SimpleExpressionEval("10 - 2 ^ 8 * 3")
print(obj2.eval_expression())