如何輸入一個字符串,如: 「1 + 2/3 * 2」 爲了給出的輸出作爲2.333如何打印輸入作爲在Java中的字符串的方程的解
基本上我想輸入一個數學方程式的字符串,並使用BODMAS輸出答案。 我試過把字符串分解成操作數組和操作符數組,但是我無法做到BODMAS部分。
如何輸入一個字符串,如: 「1 + 2/3 * 2」 爲了給出的輸出作爲2.333如何打印輸入作爲在Java中的字符串的方程的解
基本上我想輸入一個數學方程式的字符串,並使用BODMAS輸出答案。 我試過把字符串分解成操作數組和操作符數組,但是我無法做到BODMAS部分。
您可以使用堆棧來評估表達式,使用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());
}
}
}
這聽起來像一個家庭作業的問題,但不過。將其分解成操作數和操作員是一個好的開始。但是你需要保留好他們在方程中的位置的好記錄。 下一步將通過您的BOMDAS重複執行每個步驟。
因此,如果你看到一個括號做第一個方程的部分,那麼通過你的操作數進行搜索,然而注意括號,這將需要重新開始BOMDAS評估。所以也許在遞歸函數中實現它可能是強大的。 下一步搜索乘法。如果你發現任何一方都有兩個操作符的倍數。這將導致現有兩個操作員之間的新操作數。
繼續遍歷BOMDAS的每個元素,確保在執行操作時將新的操作數替換爲現有的兩個操作數和操作符。
有兩種方法可以做到這一點,使用JavaScript引擎 - Evaluating a math expression given in string form或BeanShell的解釋How to parse a mathematical expression given as a string and return a number?