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


import java.util.Stack;

/**
 * 栈实现数学表达式的运算
 *
 * @athor: Deters
 * @date: 2019/9/11 11:32
 */
public class Transfer {
    public static void main(String[] args) {
        String expression = "(2*(1+3)+8)/4+1";
        Stack<Character> characterStack = new Stack<>();
        Stack<Double> integerStack = new Stack<>();
        // 1.拆分字符串
        char[] arr = expression.toCharArray();
        // 2.将拆分好的字符依次放入两个栈中
        Double result = setStackDate(arr, characterStack, integerStack);

        System.out.println(expression + "=" + result);
    }

    /**
     * 将拆分好的字符依次放入两个栈中
     *
     * @param arr            需要运算的字符
     * @param characterStack 符号运算符
     * @param integerStack   数字运算符
     */
    private static Double setStackDate(char[] arr, Stack<Character> characterStack, Stack<Double> integerStack) {

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == '(') {
                characterStack.push(arr[i]);
                continue;
            }
            if (arr[i] == ')') {
                // 3.根据规则,弹栈并运算
                calculate(characterStack, integerStack);
                continue;
            }
            // 如果是数字
            if ('0' <= arr[i] && arr[i] <= '9') {
                integerStack.push(Double.valueOf(String.valueOf(arr[i])));
            } else {
                // 如果是运算符
                characterStack.push(arr[i]);
            }
        }
        // 将栈中,最后的结果算出
        Double num1 = integerStack.pop();
        Double num2 = integerStack.pop();
        integerStack.push(num2);
        integerStack.push(num1);
        return calculate(characterStack, integerStack);
    }

    /**
     * 根据规则进行计算
     *
     * 规则:
     * integerStack弹出两位,与characterStack弹出的一位运算符进行计算,并把结果压回到integerStack,直到characterStack为空
     *
     * @param characterStack 字符栈
     * @param integerStack   数字栈
     */
    private static Double calculate(Stack<Character> characterStack, Stack<Double> integerStack) {
        Double sum = 0.0;
        while (!characterStack.empty()) {
            Double num1 = integerStack.pop();
            Double num2 = integerStack.pop();
            Character operator = characterStack.pop();
            // 乘/除 检验
            if (!characterStack.empty() && (characterStack.peek() == '*' || characterStack.peek() == '/')) {
                Character speOperator = characterStack.pop();
                Double speNum = integerStack.pop();
                if (speOperator == '*') {
                    num2 = speNum * num2;
                } else if (speOperator == '/') {
                    num2 = speNum / num2;
                }
            }
            if (operator == '+') {
                sum = num2 + num1;
            } else if (operator == '-') {
                sum = num2 - num1;
            } else if (operator == '*') {
                sum = num2 * num1;
            } else if (operator == '/') {
                sum = num2 / num1;
            }
            integerStack.push(sum);
            // '(' 检验
            if (!characterStack.empty() && characterStack.peek() == '(') {
                characterStack.pop();
                return sum;
            }
        }
        return sum;
    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM