欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java计算数学表达式,java计算数学,import java.

来源: javaer 分享于  点击 31964 次 点评:157

java计算数学表达式,java计算数学,import java.


import java.util.EmptyStackException;import java.util.Stack;public class CaculateFunction {    private static String[] TrnsInToSufix(String IFX)// PFX放后缀表达式,IFX为中缀表达式    {        String PFX[] = new String[IFX.length()];        StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的        Stack<String> s = new Stack<String>();// 放操作符        String a;        s.push("=");// 第一个为等号        int i = 0, j = 0;        char ch;        for (i = 0; i < IFX.length();) {            ch = IFX.charAt(i);            switch (ch) {            case '0':            case '1':            case '2':            case '3':            case '4':            case '5':            case '6':            case '7':            case '8':            case '9':                while (Character.isDigit(ch) || ch == '.')// 拼数                {                    numBuffer.append(ch); // 追加字符                    ch = IFX.charAt(++i);                }                PFX[j++] = numBuffer.toString();// break;                numBuffer = new StringBuffer(); // 清空已获取的运算数字                continue; // 这里要重新循环,因为i已经增加过了            case '(':                s.push("(");                break;            case ')':                while (s.peek() != "(")                    PFX[j++] = s.pop();                break;            case '+':            case '-':                while (s.size() > 1 &amp;&amp; s.peek() != "(")                    PFX[j++] = s.pop();                a = String.valueOf(ch);                s.push(a);                break;            case '*':            case '/':                while (s.size() > 1 &amp;&amp; (s.peek() == "*") || s.peek() == "/"                        || s.peek() == "s" || s.peek() == "c"                        || s.peek() == "t" || s.peek() == "^"                        || s.peek() == "√")                    // 优先级比较,与栈顶比较,                    PFX[j++] = s.pop();// 当前操作符优先级大于等于栈顶的弹出栈顶                a = String.valueOf(ch);                s.push(a);                break;            case 's':            case 'c':            case 't':// 三角函数                while (s.size() > 1                        &amp;&amp; (s.peek() == "s" || s.peek() == "c"                                || s.peek() == "t" || s.peek() == "^" || s                                .peek() == "√"))                    // 优先级比较,与栈顶,大于等于的弹出                    PFX[j++] = s.pop();                a = String.valueOf(ch);                s.push(a);                break;            case '^':// 幂            case '√':// 开方                while (s.size() > 1 &amp;&amp; (s.peek() == "^" || s.peek() == "√"))                    PFX[j++] = s.pop();                a = String.valueOf(ch);                s.push(a);                break;            }            i++;        }        while (s.size() > 1)            PFX[j++] = s.pop();        PFX[j] = "=";        return PFX;    }    public static String Evaluate(String IFX)// 后缀表达式求值    {        String PFX[] = null;        try {            PFX = TrnsInToSufix(IFX);        } catch (EmptyStackException e) {            return "syntax error";        }        int i = 0;        double x1, x2, n;        String str;        Stack<String> s = new Stack<String>();        while (PFX[i] != "=") {            str = PFX[i];            switch (str.charAt(0)) {            case '0':            case '1':            case '2':            case '3':            case '4':            case '5':            case '6':            case '7':            case '8':            case '9':                s.push(str);                break;            case '+':                x1 = Double.parseDouble(s.pop());                x2 = Double.parseDouble(s.pop());                n = x1 + x2;                s.push(String.valueOf(n));                break;            case '-':                x1 = Double.parseDouble(s.pop());                x2 = Double.parseDouble(s.pop());                n = x2 - x1;                s.push(String.valueOf(n));                break;            case '*':                x1 = Double.parseDouble(s.pop());                x2 = Double.parseDouble(s.pop());                n = x1 * x2;                s.push(String.valueOf(n));                break;            case '/':                x1 = Double.parseDouble(s.pop());                x2 = Double.parseDouble(s.pop());                n = x2 / x1;                s.push(String.valueOf(n));                break;            case 's':                x1 = Double.parseDouble(s.pop());                n = Math.sin(x1 * Math.PI / 180);                s.push(String.valueOf(n));                break;            case 'c':                x1 = Double.parseDouble(s.pop());                n = Math.cos(x1 * Math.PI / 180);                s.push(String.valueOf(n));                break;            case 't':                x1 = Double.parseDouble(s.pop());                n = Math.tan(x1 * Math.PI / 180);                s.push(String.valueOf(n));                break;            case '√':                x1 = Double.parseDouble(s.pop());                n = Math.sqrt(x1);                s.push(String.valueOf(n));                break;// 开方            case '^':                x1 = Double.parseDouble(s.pop());                x2 = Double.parseDouble(s.pop());                n = Math.pow(x2, x1);                s.push(String.valueOf(n));                break;            }            i++;        }        String result = s.pop();        return result;    }    public static void main(String args[]) {        System.out.println(Evaluate("(31 + 21) * 51 - (21 + 33) / 2 = "));    }}
相关栏目:

用户点评