四则运算表达式求值

四则运算表达式求值
两个要点
1.中缀表达式转后缀表达式
2.后缀表达式求值

中缀表达式转后缀表达式
从左到右遍历中缀表达式的每个数字和符号.
若是数字就输出,成为后缀表达式的一部分.
若是符号则判断其与栈顶符号的优先级,是右括号或者优先级低于等于栈顶符号,则栈顶元素依次出栈并输出,再将当前的符号进栈。一直到最终输出后缀表达式为止。

后缀表达式求值
从左至右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就弹出栈顶两个元素运算,再将运算结果入栈。一直到最终获得结果。

JDK 1.7+

  1. import java.util.Deque;  
  2. import java.util.LinkedList;  
  3.   
  4. public class T {  
  5.     public static void main(String[] args) {  
  6.         String target = "9 + ( 3 - 1 ) * 3 + 10 / 2";  
  7.         System.out.println(calc(target));  
  8.     }  
  9.   
  10.     // 中缀表达式转后缀表达式  
  11.     private static Deque infixToSuffix(String str) {  
  12.         Deque result = new LinkedList();  
  13.         Deque stack = new LinkedList();  
  14.   
  15.         String[] tmp = str.split(" ");  
  16.   
  17.         for (String c : tmp) {  
  18.             c = c.trim();  
  19.             String ele = null;  
  20.             switch (c) {  
  21.             case ")":  
  22.                 while (!(ele = stack.removeFirst()).equals("(")) {  
  23.                     if (!ele.equals('(')) {  
  24.                         result.addLast(ele);  
  25.                     }  
  26.                 }  
  27.                 break;  
  28.             case "(":  
  29.                 stack.addFirst(c);  
  30.                 break;  
  31.             case "+":  
  32.             case "-":  
  33.                 while ((ele = stack.peekFirst()) != null) {  
  34.                     if (ele.equals("*") || ele.equals("/") || ele.equals("+") || ele.equals("-")) {  
  35.                         result.addLast(stack.removeFirst());  
  36.                     } else {  
  37.                         break;  
  38.                     }  
  39.                 }  
  40.                 stack.addFirst(c);  
  41.                 break;  
  42.             case "*":  
  43.             case "/":  
  44.                 stack.addFirst(c);  
  45.                 break;  
  46.             default:  
  47.                 result.addLast(c);  
  48.                 break;  
  49.             }  
  50.         }  
  51.         while (!stack.isEmpty()) {  
  52.             result.addLast(stack.removeFirst());  
  53.         }  
  54.         System.out.println(result.toString());  
  55.         return result;  
  56.     }  
  57.   
  58.     private static Float calc(String str) {  
  59.         Deque operList = infixToSuffix(str);  
  60.         Deque result = new LinkedList();  
  61.         while (!operList.isEmpty()) {  
  62.             String ele = operList.removeFirst();  
  63.             if (ele.equals("*") || ele.equals("/") || ele.equals("+") || ele.equals("-")) {  
  64.                 Float f1 = result.removeFirst();  
  65.                 Float f2 = result.removeFirst();  
  66.                 switch (ele) {  
  67.                 case "+":  
  68.                     result.addFirst(f2 + f1);  
  69.                     break;  
  70.                 case "-":  
  71.                     result.addFirst(f2 - f1);  
  72.                     break;  
  73.                 case "*":  
  74.                     result.addFirst(f2 * f1);  
  75.                     break;  
  76.                 case "/":  
  77.                     result.addFirst(f2 / f1);  
  78.                     break;  
  79.                 }  
  80.             } else {  
  81.                 result.addFirst(Float.valueOf(ele));  
  82.             }  
  83.         }  
  84.         return result.removeFirst();  
  85.     }  
  86. }  

结果:
[9, 3, 1, -, 3, *, +, 10, 2, /, +]
20.0

请使用浏览器的分享功能分享到微信等