package com.github.ipk2015.coding2017.basic.stack.expr;
import com.github.ipk2015.coding2017.basic.stack.Stack;
public class InfixExpr {
String expr = null;
public InfixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
String[] elements = getElementArray(expr);
Stack numStack = new Stack();
Stack operStack = new Stack();
manageMultiAndDivOper(elements,numStack,operStack);
return manageAddAndMinusOper(numStack,operStack);
}
private void manageMultiAndDivOper(String[] elements,Stack numStack,Stack operStack){
float preElement,nextElement;
for(int i = 0; i < elements.length;i++){
if(i%2 == 0){
numStack.push(Float.valueOf(elements[i]));
}else{
if(elements[i].equals("+") || elements[i].equals("-")){
operStack.push(elements[i]);
}else{
preElement = (Float)numStack.pop();
i++;
nextElement = Float.valueOf(elements[i]);
numStack.push(Token.doBaseOper(preElement,nextElement,elements[i-1]));
}
}
}
}
private float manageAddAndMinusOper(Stack numStack,Stack operStack){
float result = 0f;;
while(!operStack.isEmpty()){
result = Token.doBaseOper(result,(Float)numStack.pop(),(String)operStack.pop());
}
result += (Float)numStack.pop();
return result;
}
public String[] getElementArray(String expression){
char[] charArray = expression.toCharArray();
StringBuffer stringBuffer = new StringBuffer();
for(int i = 0;i<charArray.length;i++){
if(charArray[i] == '+' || charArray[i] == '-' || charArray[i] == '*' || charArray[i] == '/'){
stringBuffer.append(","+charArray[i]+",");
}else{
stringBuffer.append(charArray[i]);
}
}
return stringBuffer.toString().split(",");
}
}