package com.Util;
import java.util.Stack;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Enumeration;
public class ParseFunc {
public static ParseFunc glbParseFunc = null;
private final String OP="(+,-,*,/,#)";
private Stack opnd = null;
private Stack optr = null;
private HashMap h_optr = null;
private boolean minusAsNumber;
/**
* construct the com.Util.ParseFunc
*/
private ParseFunc() {
opnd = new Stack();
optr = new Stack();
opnd.clear();
optr.clear();
}
/**
* get ParseFunc's Instance
* @return ParseFunc
*/
public static ParseFunc getInstance() {
glbParseFunc = new ParseFunc();
glbParseFunc.initOptr();
return glbParseFunc;
}
/**
* init optr's pri
*/
private void initOptr(){
ArrayList[] row = new ArrayList[46];
h_optr = new HashMap();
for(int i=0;i<row.length;i++)
row[i] = new ArrayList();
//'+'-----------
row[0].add("+");
row[0].add("+");
h_optr.put(row[0],">");
row[1].add("+");
row[1].add("-");
h_optr.put(row[1],">");
row[2].add("+");
row[2].add("*");
h_optr.put(row[2],"<");
row[3].add("+");
row[3].add("/");
h_optr.put(row[3], "<");
row[4].add("+");
row[4].add("(");
h_optr.put(row[4], "<");
row[5].add("+");
row[5].add(")");
h_optr.put(row[5], ">");
row[6].add("+");
row[6].add("#");
h_optr.put(row[6], ">");
//'-'----------------
row[7].add("-");
row[7].add("+");
h_optr.put(row[7], ">");
row[8].add("-");
row[8].add("-");
h_optr.put(row[8], ">");
row[9].add("-");
row[9].add("*");
h_optr.put(row[9], "<");
row[10].add("-");
row[10].add("/");
h_optr.put(row[10], "<");
row[11].add("-");
row[11].add("(");
h_optr.put(row[11], "<");
row[12].add("-");
row[12].add(")");
h_optr.put(row[12], ">");
row[13].add("-");
row[13].add("#");
h_optr.put(row[13], ">");
//'*'----------------
row[14].add("*");
row[14].add("+");
h_optr.put(row[14], ">");
row[15].add("*");
row[15].add("-");
h_optr.put(row[15], ">");
row[16].add("*");
row[16].add("*");
h_optr.put(row[16], ">");
row[17].add("*");
row[17].add("/");
h_optr.put(row[17], ">");
row[18].add("*");
row[18].add("(");
h_optr.put(row[18], "<");
row[19].add("*");
row[19].add(")");
h_optr.put(row[19], ">");
row[20].add("*");
row[20].add("#");
h_optr.put(row[20], ">");
//'/'----------------
row[21].add("/");
row[21].add("+");
h_optr.put(row[21], ">");
row[22].add("/");
row[22].add("-");
h_optr.put(row[22], ">");
row[23].add("/");
row[23].add("*");
h_optr.put(row[23], ">");
row[24].add("/");
row[24].add("/");
h_optr.put(row[24], ">");
row[25].add("/");
row[25].add("(");
h_optr.put(row[25], "<");
row[26].add("/");
row[26].add(")");
h_optr.put(row[26], ">");
row[27].add("/");
row[27].add("#");
h_optr.put(row[27], ">");
//'('----------------
row[28].add("(");
row[28].add("+");
h_optr.put(row[28], "<");
row[29].add("(");
row[29].add("-");
h_optr.put(row[29], "<");
row[30].add("(");
row[30].add("*");
h_optr.put(row[30], "<");
row[31].add("(");
row[31].add("/");
h_optr.put(row[31], "<");
row[32].add("(");
row[32].add("(");
h_optr.put(row[32], "<");
row[33].add("(");
row[33].add(")");
h_optr.put(row[33], "=");
//')'----------------
row[34].add(")");
row[34].add("+");
h_optr.put(row[34], ">");
row[35].add(")");
row[35].add("-");
h_optr.put(row[35], ">");
row[36].add(")");
row[36].add("*");
h_optr.put(row[36], ">");
row[37].add(")");
row[37].add("/");
h_optr.put(row[37], ">");
row[38].add(")");
row[38].add(")");
h_optr.put(row[38], ">");
row[39].add(")");
row[39].add("#");
h_optr.put(row[39], ">");
//'#'----------------
row[40].add("#");
row[40].add("+");
h_optr.put(row[40], "<");
row[41].add("#");
row[41].add("-");
h_optr.put(row[41], "<");
row[42].add("#");
row[42].add("*");
h_optr.put(row[42], "<");
row[43].add("#");
row[43].add("/");
h_optr.put(row[43], "<");
row[44].add("#");
row[44].add("(");
h_optr.put(row[44], "<");
row[45].add("#");
row[45].add("#");
h_optr.put(row[45], "=");
}
/**
* @param c char
* @return boolean
*/
private boolean isOP(final char c) {
int index = 0;
index = OP.indexOf(c);
if(minusAsNumber && c=='-')
index = -1;
if(c == '(') {
minusAsNumber = true;
}
else {
minusAsNumber = false;
}
if(index < 0) {
return false;
}
return true;
}
/**
* @param express char[]
* @param start int
* @return int
*/
private int getNumberEnd(final char[] express,int start) {
int end = start;
if(express[end] == '-')
end ++;
while(!isOP(express[end]))
end ++;
return end;
}
/**
* @param optr1 String
* @param optr2 String
* @return char
*/
private char precede(String optr1,String optr2){
ArrayList t_row = new ArrayList();
t_row.add(optr1);
t_row.add(optr2);
String pri = (String)h_optr.get(t_row);
return (pri.toCharArray())[0];
}
/**
* @param val1 double
* @param op String
* @param val2 double
* @return double
*/
private static double operate(double val1,String op,double val2){
char[] t_op=op.toCharArray() ;
double t_val = 0;
switch(t_op[0]){
case '+':
t_val = val1+val2;
break;
case '-':
t_val = val1-val2;
break;
case '*':
t_val = val1*val2;
break;
case '/':
t_val = val1/val2;
break;
default:
break;
}
return t_val;
}
public double evaluateExpression(String expression){
opnd = new Stack();
optr = new Stack();
optr.push("#");
char[] c = expression.toCharArray();
int i = 0;
double val = 0;
System.out.println("top="+(String)optr.get(optr.size()-1 ));
minusAsNumber = true;
while(i<c.length &&
(c[i] != '#' || !(((String)optr.get(optr.size()-1 )).equals("#")))){
if(!isOP(c[i])){
int end=getNumberEnd(c,i);
opnd.push(expression.substring(i,end));
System.out.println("push opnd "+i+"--"+expression.substring(i,end));
i = end;
}
else{
System.out.println((String)optr.get(optr.size()-1)+"---"+c[i]);
switch(this.precede((String)optr.get(optr.size()-1),String.valueOf(c[i]))){
case '<':
optr.push(String.valueOf(c[i]));
System.out.println("push optr "+i+"--"+c[i]);
i++;
break;
case '=':
String tmp = (String)optr.pop();
System.out.println("pop optr "+i+"--"+tmp);
i++;
break;
case '>':
String op = (String)optr.pop();
double val1,val2;
val2 = Double.parseDouble((String)opnd.pop() );
val1 = Double.parseDouble((String)opnd.pop() );
val = this.operate(val1,op,val2);
opnd.push(String.valueOf(val));
System.out.println("operate---pop"+"--"+val1+"---"+val2);
System.out.println("push opnd"+"--"+val);
break;
}
}
}
val = Double.parseDouble((String)opnd.get(opnd.size()-1));
return val;
}
public static void main(String agrs[]){
ParseFunc.getInstance();
System.out.println(ParseFunc.glbParseFunc.h_optr.size() );
System.out.println(ParseFunc.glbParseFunc.precede("+","-"));
System.out.println("-3000.1/(-2+3)*5="+ParseFunc.glbParseFunc.evaluateExpression("-3000.1/(-2+3)*5#"));
}
}