1 import java.util.Stack; 2 3 /** 4 * 栈实现数学表达式的运算 5 * 6 * @athor: Deters 7 * @date: 2019/9/11 11:32 8 */ 9 public class Transfer { 10 public static void main(String[] args) { 11 String expression = "(2*(1+3)+8)/4"; 12 Stack<Character> characterStack = new Stack<>(); 13 Stack<Integer> integerStack = new Stack<>(); 14 // 1.拆分字符串 15 char[] arr = expression.toCharArray(); 16 // 2.将拆分好的字符依次放入两个栈中 17 int result = setStackDate(arr, characterStack, integerStack); 18 19 System.out.println(expression + "=" + result); 20 } 21 22 /** 23 * 将拆分好的字符依次放入两个栈中 24 * 25 * @param arr 需要运算的字符 26 * @param characterStack 符号运算符 27 * @param integerStack 数字运算符 28 */ 29 private static int setStackDate(char[] arr, Stack<Character> characterStack, Stack<Integer> integerStack) { 30 31 for (int i = 0; i < arr.length; i++) { 32 if (arr[i] == '(') { 33 continue; 34 } 35 if (arr[i] == ')') { 36 // 3.根据规则,弹栈并运算 37 calculate(characterStack, integerStack); 38 continue; 39 } 40 // 如果是数字 41 if ('0' <= arr[i] && arr[i] <= '9') { 42 integerStack.push(Integer.valueOf(String.valueOf(arr[i]))); 43 } else { 44 // 如果是运算符 45 characterStack.push(arr[i]); 46 } 47 } 48 // 将栈中,最后的结果算出 49 Integer num1 = integerStack.pop(); 50 Integer num2 = integerStack.pop(); 51 integerStack.push(num2); 52 integerStack.push(num1); 53 return calculate(characterStack, integerStack); 54 } 55 56 /** 57 * 根据规则进行计算 58 * <p> 59 * 规则: 60 * (2*(1+3)+8)/4 61 * integerStack弹出两位,与characterStack弹出的一位运算符进行计算,并把结果压回到integerStack,直到characterStack为空 62 * 63 * @param characterStack 字符栈 64 * @param integerStack 数字栈 65 */ 66 private static int calculate(Stack<Character> characterStack, Stack<Integer> integerStack) { 67 Integer sum = 0; 68 while (!characterStack.empty()) { 69 Integer num1 = integerStack.pop(); 70 Integer num2 = integerStack.pop(); 71 Character operator = characterStack.pop(); 72 if (operator == '+') { 73 sum = num2 + num1; 74 } else if (operator == '-') { 75 sum = num2 - num1; 76 } else if (operator == '*') { 77 sum = num2 * num1; 78 } else if (operator == '/') { 79 sum = num2 / num1; 80 } 81 integerStack.push(sum); 82 } 83 return sum; 84 } 85 }