def pref(op): print "called with op", op ret = -1 if op == '+': print "matched +" ret = 1 if op == '-': print "matched -" ret = 2 if op == '*': print "matched *" ret = 3 if op == '/': print "matched /" ret = 4 return ret def evaluate(expr, operand_stack, operator_stack): print "**In evaluate**" print operator_stack print operand_stack expr1 = operand_stack.pop() expr2 = operand_stack.pop() op = operator_stack.pop() # Parenthesize the expression expr = "(" + expr2 + op + expr1 + ")" print "expr1", expr1 print "expr2", expr2 print "expr", expr # Push the result back on the stack operand_stack.append(expr) print operator_stack print operand_stack print "**Out evaluate**" return expr def looper(str, expr, operator_stack, operand_stack): l = 0 cnt = len(str) # Loop over the input string while l < cnt: if str[l] in ('+', '-', '*', '/'): print "operator found: op, index", str[l], l print operator_stack, len(operator_stack) x = len(operator_stack) - 1 if x > 0: print "Comparing:", operator_stack[x], str[l] # If op on stack has higher preference than the op in question if (pref(operator_stack[x]) > pref(str[l])): expr = evaluate(expr, operand_stack, operator_stack) operator_stack.append(str[l]) else: # Add the operand to operand stack operand_stack.append(str[l]) l += 1 print operator_stack print operand_stack print "Take care of last elements" op_cnt = len(operator_stack) while op_cnt: expr = evaluate(expr, operand_stack, operator_stack) op_cnt -= 1 print operator_stack print operand_stack if __name__ == '__main__': str = "a+c*d-e/w*x+a-s" cnt = len(str) operand_stack = [] operator_stack = [] expr = "" looper(str, expr, operator_stack, operand_stack) print "Output=>", operand_stack[0]
Advertisements