package com.coding.basic.stack.expr;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.coding.basic.Stack;
import com.coding.basic.StackUtil;
public class InfixExpr {
String expr = null;
public InfixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
if(expr==null|| expr.equals("")){
return 0.0f;
}
Stack numStack=new Stack();
Stack opoStack=new Stack();
int num = 0;
StringTokenizer st = new StringTokenizer(expr,"+,-,*,/",true);
while(st.hasMoreElements()){
String s=(String) st.nextElement();
if("+".equals(s) || "*".equals(s) || "-".equals(s)|| "/".equals(s)){
if(opoStack.isEmpty()){
opoStack.push(s);
}
else{
num=opoPush(opoStack,numStack,s);
}
}
else {
// if(num!=0){
// Stack temp=new Stack();
// while(!numStack.isEmpty()){
// temp.push(numStack.pop());
// }
// String top = null;
// String a = null;
// int j=0;
// while(!temp.isEmpty()){
// top=(String) temp.pop();
// if(j==num){
// a=top;
// numStack.push(s);
// }
// else{
// numStack.push(top);
// }
// j++;
// }
// numStack.push(a);
// }
// else{
// numStack.push(s);
// }
numStack.push(s);
}
}
float result = 0;
if(!opoStack.isEmpty()){
String opoOne=(String) opoStack.pop();
String opoTwo=(String) opoStack.pop();
opoStack.push(opoTwo);
opoStack.push(opoOne);
if(("*".equals(opoOne)||"/".equals(opoOne))&&("*".equals(opoTwo)||"/".equals(opoTwo))){
}
else if("*".equals(opoOne)||"/".equals(opoOne)){
float one= Float.parseFloat((String) numStack.pop()) ;
float two= Float.parseFloat((String) numStack.pop());
String opo=(String) opoStack.pop();
if("-".equals(opo)){
result=two-one;
}
else if("+".equals(opo)){
result=one+two;
}
else if("/".equals(opo)){
result=two/one;
}
else {
result=two*one;
}
numStack.push(result+"");
}
}
Stack revOpo=new Stack();
Stack revNum=new Stack();
while(!opoStack.isEmpty()){
revOpo.push(opoStack.pop());
}
while(!numStack.isEmpty()){
revNum.push(numStack.pop());
}
while(!revOpo.isEmpty()){
float one= Float.parseFloat((String) revNum.pop()) ;
float two= Float.parseFloat((String) revNum.pop());
String opo=(String) revOpo.pop();
if("-".equals(opo)){
result=one-two;
}
else if("+".equals(opo)){
result=one+two;
}
else if("/".equals(opo)){
result=one/two;
}
else {
result=two*one;
}
revNum.push(result+"");
}
return Float.parseFloat((String) revNum.pop());
}
//2+3*4+5 5-2-2+3--> 5+3-2 75/3/5*5 15*5/3
private int opoPush(Stack opoStack,Stack numStack,Object opo){
int num=0;//记录减号的最深位置
if("+".equals(opo)){
if(!opoStack.isEmpty()){
if("*".equals(opoStack.peek())||"/".equals(opoStack.peek())){
float one= Float.parseFloat((String) numStack.pop()) ;
float two= Float.parseFloat((String) numStack.pop());
float result;
if("*".equals(opoStack.peek())){
opoStack.pop();
result=two*one;
}
else{
result=two/one;
}
numStack.push(result+"");
}
}
// Stack temp=new Stack();
// boolean flag=false; //记录是否转移位置
// while(!opoStack.isEmpty()){
// temp.push(opoStack.pop());
// }
// int i=0;
// while(!temp.isEmpty()){
// String top= (String) temp.pop();
// if("-".equals(top)&&!flag){
// num=i+1;
// opoStack.push("+");
// flag=true;
// }
// opoStack.push(top);
// i++;
// }
// if(!flag){
// opoStack.push("+");
// }
opoStack.push("+");
}
else if("-".equals(opo)){
if(!opoStack.isEmpty()){
if("*".equals(opoStack.peek())||"/".equals(opoStack.peek())){
float one= Float.parseFloat((String) numStack.pop()) ;
float two= Float.parseFloat((String) numStack.pop());
float result;
if("*".equals(opoStack.peek())){
opoStack.pop();
result=one*two;
}
else{
result=one/two;
}
numStack.push(result+"");
}
}
opoStack.push("-");
}
else if("*".equals(opo)){
// Stack temp=new Stack();
// boolean flag=false; //记录是否转移位置
// while(!opoStack.isEmpty()){
// temp.push(opoStack.pop());
// }
// int i=0;
// while(!temp.isEmpty()){
// String top=(String) temp.pop();
// if("/".equals(top)&&!flag){
// num=i+1;
// opoStack.push("*");
// flag=true;
// }
// opoStack.push(top);
// i++;
// }
// if(!flag){
// opoStack.push("*");
// }
opoStack.push("*");
}
else if("/".equals(opo)){
opoStack.push("/");
}
return num;
}
}