2015-09-12 35 views
0

我試圖在java中實現這個僞代碼來評估算術表達式。但我總是得到最後一位數字:即如果我做1 + 2,我會得到2;我不知道我做錯了什麼,所以如果有人有任何想法,請讓我知道!用於評估表達式的Java算法

Algorithm here

import java.util.Stack; 

public class Main { 

    static Stack<String> ops = new Stack<String>(); 
    static Stack<Double> vals = new Stack<Double>(); 

    private static void doOP() { 
     double x = vals.pop(); 
     double y = vals.pop(); 
     String op = ops.pop(); 

     double v = 0; 
     if (op.equals("+")) { 
      v = y + x; 
     } else { 
      if (op.equals("-")) { 
       v = y - x; 
      } else { 
       if (op.equals("*")) { 
        v = y * x; 

       } else { 
        if (op.equals("/")) { 
         v = y/x; 
        } 
       } 
      } 
     } 
     vals.push(v); 
    } 

    private static void repeatOps(String refOp) { 
     while ((vals.size() > 1) && (prec(refOp) <= prec(ops.peek()))) { 
      doOP(); 
     } 
    } 

    private static int prec(String refOp) { 

     String[] bodmas = new String[] { "(", ")", "/", "*", "+", "-", "$" }; 
     int i = 0; 
     for (String operation : bodmas) { 
      if (refOp.equals(operation)) { 
       return i; 
      } 
      i++; 
     } 
     return -0; 
    } 

    private static boolean isNumber(String number) { 
     try { 
      @SuppressWarnings("unused") 
      double d = Double.parseDouble(number); 
     } catch (Exception e) { 
      return false; 
     } 
     return true; 
    } 

    private static Double evalExp(String exp) { 
     for (char z : exp.toCharArray()) {   
      if (isNumber(z + "")) { 
       vals.push(Double.parseDouble(z + "")); 
      } else { 
       repeatOps(z + ""); 
       ops.push(z + ""); 
      } 
     } 
     repeatOps("$"); 
     return vals.peek(); 
    } 

    public static void main(String[] args) { 
     System.out.println(evalExp("3*2")); 
    } 
} 
+0

此問題已解決。如果你想做更簡單算術的更高級的東西,我建議考慮詞法分析器/解析器和語法;想想Antlr。 – duffymo

回答

1

prec()方法反轉和不正確的。

$應該是最低優先,意思是最低值,例如, 0

+-應該有相同優先。

*/應該有相同優先。

()不是二元運算符,並且不能用所描述的邏輯來處理。

所以,解決prec返回0$1+-,並2*/