如何输入字符串,例如: " 1 + 2/3 * 2" 输出为2.333
基本上我想输入一个数学方程式的字符串,并使用BODMAS输出答案。 我已经尝试将字符串分成一系列操作数和一组操作符,但是我无法执行BODMAS部分。
答案 0 :(得分:0)
您可以使用堆栈来评估表达式,使用Dijkstra的twostack算法。
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());
}
}
}
答案 1 :(得分:0)
这听起来像是一个家庭作业问题但是。 将其分解为操作数和运算符是一个良好的开端。但是你需要保持他们在等式中的位置的良好记录。 下一步将遍历您的BOMDAS以分别执行每个步骤。
因此,如果您看到括号首先执行该部分,请搜索您的操作数,但是请注意括号,这将需要重新开始BOMDAS评估。所以也许在递归函数中实现它可能是强大的。 接下来搜索乘法。如果你找到一个多个两边的两个操作数。这将导致现有两个运算符之间出现新的操作数。
继续遍历BOMDAS的每个元素,确保在执行操作时,将使用新操作数代替现有的两个操作数和运算符。
答案 2 :(得分:0)
有两种方法,使用Javascript引擎 - Evaluating a math expression given in string form或BeanShell解释器How to parse a mathematical expression given as a string and return a number?