All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.shmilyhe.convert.tools.ExpCalculate3 Maven / Gradle / Ivy

There is a newer version: 3.1.3
Show newest version
package io.shmilyhe.convert.tools;

import java.util.ArrayList;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExpCalculate3 {


    private static double doubleCal(double a1, double a2, char operator) throws Exception {
        switch (operator) {
        case '+':
        return a1 + a2;
        case '-':
        return a1 - a2;
        case '*':
        return a1 * a2;
        case '/':
        return a1 / a2;
        default:
        break;
        }
        throw new Exception("illegal operator!");
    }

    private static int getPriority(String s) throws Exception {
        if(s==null) return 0;switch(s) {
            case "(":return 1;
            case "+":;
            case "-":return 2;
            case "*":;
            case "/":return 3;
            default:break;
        }throw new Exception("illegal operator!");
    }

    private static String toSufExpr(String expr) throws Exception {

    System.out.println("将"+expr+"解析为后缀表达式...");/*返回结果字符串*/
    StringBuffer sufExpr= new StringBuffer();/*盛放运算符的栈*/
    Stack operator = new Stack();
    operator.push(null);//在栈顶压人一个null,配合它的优先级,目的是减少下面程序的判断

    /*将expr打散分散成运算数和运算符*/
    Pattern p= Pattern.compile("(?");

    Matcher m =p.matcher(expr);
    while(m.find()) {

    String temp=m.group();if (temp.matches("[+\\-*/()]")) { //是运算符

        if (temp.equals("(")) { //遇到左括号,直接压栈
            operator.push(temp);
        System.out.println("'('压栈");

        }else if (temp.equals(")")) { //遇到右括号,弹栈输出直到弹出左括号(左括号不输出)

    String topItem = null;
    while (!(topItem = operator.pop()).equals("(")) {
    System.out.println(topItem+"弹栈");
        sufExpr.append(topItem+" ");
        System.out.println("输出:"+sufExpr);
    }

}else {//遇到运算符,比较栈顶符号,若该运算符优先级大于栈顶,直接压栈;若小于栈顶,弹栈输出直到大于栈顶,然后将改运算符压栈。

while(getPriority(temp) <=getPriority(operator.peek())) {

sufExpr.append(operator.pop()+" ");

System.out.println("输出sufExpr:"+sufExpr);

}

operator.push(temp);

System.out.println("\""+temp+"\""+"压栈");

}

}else {//遇到数字直接输出

sufExpr.append(temp+" ");

System.out.println("输出sufExpr:"+sufExpr);

}

}

String topItem= null;//最后将符合栈弹栈并输出

while(null != (topItem =operator.pop())) {

sufExpr.append(topItem+" ");

}return sufExpr.toString();

}

public static String getResult(String expr) throws Exception {
    System.out.println("计算"+expr);
    /*数字栈*/
    Stack number = new Stack(); 
    /*符号栈*/
    Stack operator = new Stack();
    operator.push(null);// 在栈顶压人一个null,配合它的优先级,目的是减少下面程序的判断

    /* 将expr打散为运算数和运算符 */
    //Pattern p = Pattern.compile("(? tokens = new  ArrayList();
    int offset =0;
    StringBuilder part=new StringBuilder();
    for(int i=0;i0&&offset>0){tokens.add(part.toString());
                tokens.add(String.valueOf(exp.charAt(i)));
                part=new StringBuilder();
                }else{
                    part.append(ch);
                }
            break;
            case '/':
            case '*':
            case '(':
            case ')':
                if(part.length()>0)tokens.add(part.toString());
                tokens.add(String.valueOf(exp.charAt(i)));
                part=new StringBuilder();
                offset=0;
            break;
            default:
            part.append(ch);
            break;
        }
        offset+=1;
    }
    return tokens.toArray(new String[tokens.size()]);
}


    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy