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; } }