Java实现简单的数学表达式计算

public class T {
    public static void main(String[] args) {
        long calculate = calculate("12+2312*(623+23*61*(6))");
        System.out.println(calculate);
    }


    public static long calculate(String express) {
        Queue<Integer> queue = new LinkedList<>();
        Stack<Integer> numStack = new Stack<>();
        Stack<Character> operateStack = new Stack<>();
        operateStack.push('#');
        int num1, num2;
        char[] chars = express.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (isDigits(chars[i])) {
                queue.offer(chars[i] - '0');
                int j = i + 1;
                for (; isDigits(chars[j]); j++) {
                    queue.offer(chars[j] - '0');
                }
                i = j - 1;
                numStack.push(toNumber(queue));
            } else if (isOperate(chars[i])) {
                if (comparePriority(operateStack.peek(), chars[i])) {
                    i--;
                    Character operate = operateStack.pop();
                    if (numStack.size() < 2) {
                        throw new IllegalArgumentException();
                    }
                    num1 = numStack.pop();
                    num2 = numStack.pop();
                    numStack.push(calculate(num1, num2, operate));
                } else {
                    operateStack.push(chars[i]);
                }
            } else if (chars[i] == '(') {
                operateStack.push(chars[i]);
            } else if (chars[i] == ')') {
                Character operate = operateStack.pop();
                while (operate != '(') {
                    num1 = numStack.pop();
                    num2 = numStack.pop();
                    numStack.push(calculate(num1, num2, operate));
                    operate = operateStack.pop();
                }
            } else {
                throw new IllegalArgumentException();
            }
        }
        Character operate = operateStack.pop();
        while (operate != '#') {
            num1 = numStack.pop();
            num2 = numStack.pop();
            numStack.push(calculate(num1, num2, operate));
            operate = operateStack.pop();
        }
        return numStack.pop();
    }

    private static int calculate(int a, int b, char operate) {
        switch (operate) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
            default:
                throw new IllegalArgumentException();
        }
    }

    private static boolean isDigits(char c) {
        return c >= '0' && c <= '9';
    }

    private static boolean isOperate(char c) {
        return c == '+' || c == '-' || c == '/' || c == '*' || c == '#';
    }

    private static boolean comparePriority(char one, char two) {
        if ((one == '*' || one == '/')
                && (two == '+' || two == '-')) {
            return true;
        }
        return (one == '+' || one == '-') && two == '#';
    }

    private static int toNumber(Queue<Integer> queue) {
        int res = 0;
        for (; !queue.isEmpty(); ) {
            res = res * 10 + queue.poll();
        }
        return res;
    }
}
发布了162 篇原创文章 · 获赞 44 · 访问量 8841

猜你喜欢

转载自blog.csdn.net/P19777/article/details/103617082