黑马程序员技术交流社区

标题: java计算数学表达式(中缀转后缀加运算) [打印本页]

作者: sansu    时间: 2015-9-10 22:57
标题: 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 && s.peek() != "(")
                    PFX[j++] = s.pop();
                a = String.valueOf(ch);
                s.push(a);
                break;
            case '*':
            case '/':
                while (s.size() > 1 && (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
                        && (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 && (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 != "=") {
            str = PFX;
            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 = "));
    }
}




作者: wu199309023    时间: 2015-9-10 22:59
好牛逼呀这么长的代码




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2