栈如何运用在四则运算中(JAVA实现)

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#"));
  }

}

你可能感兴趣的:(栈如何运用在四则运算中(JAVA实现))