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