package com.coding.basic.stack.expr;
import java.util.List;
import com.coding.basic.Stack;
public class PrefixExpr {
String expr = null;
public PrefixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
TokenParser tokenParser=new TokenParser();
List<Token> tokens=tokenParser.parse(expr);
Stack stack=new Stack();
for(Token token:tokens){
if(token.isNumber()){
float result = 0;
if(!(stack.peek().equals("-")||stack.peek().equals("*")||stack.peek().equals("/")||stack.peek().equals("+"))){
float one = new Float( (float)stack.pop());
float two =token.getIntValue();
String ope=(String) stack.pop();
if(ope.equals("-")){
result=one-two;
}
else if(ope.equals("*")){
result=two*one;
}
else if(ope.equals("/")){
result=one/two;
}
else if(ope.equals("+")){
result=two+one;
}
while(!("-".equals(stack.peek())||"*".equals(stack.peek())||"/".equals(stack.peek())||"+".equals(stack.peek()))&&!stack.isEmpty()){
one =new Float( (float)stack.pop());
ope=(String) stack.pop();
if(ope.equals("-")){
result=one-result;
}
else if(ope.equals("*")){
result=result*one;
}
else if(ope.equals("/")){
result=one/result;
}
else if(ope.equals("+")){
result=result+one;
}
}
stack.push(result);
}
else
stack.push(new Float((float)token.getIntValue()));
}
else if(token.isOperator()){
stack.push(token.toString());
}
}
while(stack.size()>1){
float one = new Float( (float)stack.pop());
float two = new Float( (float)stack.pop());
float result = 0;
String ope=(String) stack.pop();
if(ope.equals("-")){
result=two-one;
}
else if(ope.equals("*")){
result=two*one;
}
else if(ope.equals("/")){
result=two/one;
}
else if(ope.equals("+")){
result=two+one;
}
stack.push(result);
}
return (float) stack.pop() ;
}
}