2016-10-23 41 views

回答

0

您可以使用堆棧來評估表達式,使用Dijkstra的雙棧算法。

public class DijkstraTwoStack { 
    public static void main(String[] args) { 
     Scanner scanner = new Scanner(System.in); 
     String exp[] = scanner.nextLine().split(" "); 
     Stack<String> ops = new Stack<String>(); 
     Stack<Double> vals = new Stack<Double>(); 

     for(int i = 0; i < exp.length; i++) { 
         String s = exp[i]; 
      if (s.equals("(")) { 
      } 
      else if (s.equals("+") || s.equals("*")) { 
       ops.push(s); 
      } else if (s.equals(")")) { 
       getComp(ops, vals); 
      } else { 
       vals.push(Double.parseDouble(s)); 
      } 
     } 
     getComp(ops, vals); 
     System.out.println(vals.pop()); 
    } 

    private static void getComp(Stack<String> ops, Stack<Double> vals) { 
     String op = ops.pop(); 
     if (op.equals("+")) { 
      vals.push(vals.pop() + vals.pop()); 
     } else if (op.equals("*")) { 
      vals.push(vals.pop() * vals.pop()); 
     } 
    } 
} 
0

這聽起來像一個家庭作業的問題,但不過。將其分解成操作數和操作員是一個好的開始。但是你需要保留好他們在方程中的位置的好記錄。 下一步將通過您的BOMDAS重複執行每個步驟。

因此,如果你看到一個括號做第一個方程的部分,那麼通過你的操作數進行搜索,然而注意括號,這將需要重新開始BOMDAS評估。所以也許在遞歸函數中實現它可能是強大的。 下一步搜索乘法。如果你發現任何一方都有兩個操作符的倍數。這將導致現有兩個操作員之間的新操作數。

繼續遍歷BOMDAS的每個元素,確保在執行操作時將新的操作數替換爲現有的兩個操作數和操作符。

相關問題