from stack import Stack
from binarytree import BinaryTree
import operator

def buildParseTree(exp):
    #This is what you write in part A
    tokens = exp.split(" ")
    operators = ["+","-","*","/"]
    s = Stack()
    for tok in tokens:
        if tok.isdigit():
            s.push(BinaryTree(tok))
        elif tok in operators:
            if len(s)>=2:
                bt = BinaryTree(tok)
                bt.setRight(s.pop())
                bt.setLeft(s.pop())
                s.push(bt)
            else:
                print "Expression is not in proper postfix notation"
                return
        else:
            print "Expression is not in proper postfix notation"
            return
    if len(s)==1:
        return s.pop()
    else:
        print "Expression is not in proper postfix notation"
        return        


def evaluate(parseTree):
    opers = {'+':operator.add,
             '-':operator.sub,
             '*':operator.mul,
             '/':operator.div }
    left = parseTree.getLeft()
    right = parseTree.getRight()
    if left.isEmpty() or right.isEmpty():
        return int(parseTree.getRoot())
    else:
        fn = opers[parseTree.getRoot()]
        return fn(evaluate(left),evaluate(right))        
    

def toInfix(parseTree):
    #part b
    lower = ["+","-"]
    higher = ["*","/"]
    if parseTree.isEmpty():
        return ""
    else:
        output = ""
        if parseTree.getRoot() in higher and parseTree.getLeft().getRoot() in lower:
            output += "("+toInfix(parseTree.getLeft())+")"
        else:
            output += toInfix(parseTree.getLeft())
        output += parseTree.getRoot()
        if parseTree.getRoot() in higher and parseTree.getRight().getRoot() in lower:
            output += "("+toInfix(parseTree.getRight())+")"
        else:
            output += toInfix(parseTree.getRight())
        return output
    
