字符串计算公式(zz)

    技术2022-05-11  87

    import java.util.ListIterator;import java.util.Stack;

    public class CalStr {    private String src;

        /**     * constructor     *      * @param srcthe string(expression) to calculate     */    public CalStr(String src) {        this.src = src;    }

        /**     * calculate to get the result     *      * @return(double)result     */    public double getResult() {        String postfix = getPostfix();        Stack stk = new Stack();        // System.out.println(postfix);        String parts[] = postfix.split(" +");        double result = 0;        for (int i = 0; i < parts.length; i++) {            char tmp = parts[i].charAt(0);            if (!isOperator(tmp)) {                stk.push(parts[i]);            } else {                double a = Double.parseDouble((String) stk.pop());                double b = Double.parseDouble((String) stk.pop());                // b is followed by a in the orignal expression                result = calculate(b, a, tmp);                stk.push(String.valueOf(result));            }        }        return result;    }

        /**     * test if the character is an operator,such +,-,*,/     *      * @param opthe character to test     * @returntrue if op is an operator otherwise false     */    private boolean isOperator(char op) {        return (op == '+' || op == '-' || op == '*' || op == '/');    }

        /**     * calculate an expression such (a op b)     *      * @param anumber 1     * @param bnumber 2     * @param opthe operator     * @return(double)(a op b)     */    public double calculate(double a, double b, char op) {        switch (op) {        case '+':            return a + b;        case '-':            return a - b;        case '*':            return a * b;        case '/':            return a / b;        }        return -1;    }

        /**     * convert the suffix to postfix     *      * @returnthe postfix as a string     */    private String getPostfix() {        Stack stk = new Stack();        String postfix = new String();        char op;        int i = 0;        while (i < src.length()) {            if (Character.isDigit(src.charAt(i)) || src.charAt(i) == '.') {                postfix += " ";                do {                    postfix += src.charAt(i++);                } while ((i < src.length())                        && (Character.isDigit(src.charAt(i))));                postfix += " ";            }

                else {                switch (op = src.charAt(i++)) {                case '(':                    stk.push("(");                    break;

                    case ')':                    while (stk.peek() != "(") {                        String tmp = (String) stk.pop();                        postfix += tmp;                        if (tmp.length() == 1 && isOperator(tmp.charAt(0)))                            postfix += " ";                    }                    stk.pop();                    postfix += " ";                    break;

                    case '+':                case '-':                    while ((!stk.empty()) && (stk.peek() != "(")) {                        postfix += stk.pop() + " ";                    }                    stk.push(String.valueOf(new Character(op)));                    break;

                    case '*':                case '/':                    while ((!stk.empty())                            && ((stk.peek() == "*") || (stk.peek() == "/"))) {                        postfix += stk.pop() + " ";                    }                    stk.push(String.valueOf(new Character(op)));                    break;                }            }        }        ListIterator it = stk.listIterator(stk.size());        while (it.hasPrevious())            postfix += it.previous() + " ";        return postfix.trim().replaceAll(" +//.", ".");    }

        /**     * main function     *      * @param args     */    public static void main(String args[]) {        System.out.println(new CalStr("((1.5+6.000)*9+9.36)*(8+9-8*8+8*7)")                .getResult());    }}

     

    这个程序是可以编译直接运行的

    ("((1.5+6.000)*9+9.36)*(8+9-8*8+8*7)")

    结果 691.74 


    最新回复(0)