我需要实现功能public int eval(String infix) {...}
,当我像这样使用它时:
eval("3+2*(4+5)")
我必须收到 21。
算术表达式可以包含“+”、“*”和括号。
那么,如何将其转换为数学方程?我不能使用非标准库。
更新:找到解决方案。
它有 2 种方式:波兰表示法和使用 ScriptEngine。
我需要实现功能public int eval(String infix) {...}
,当我像这样使用它时:
eval("3+2*(4+5)")
我必须收到 21。
算术表达式可以包含“+”、“*”和括号。
那么,如何将其转换为数学方程?我不能使用非标准库。
更新:找到解决方案。
它有 2 种方式:波兰表示法和使用 ScriptEngine。
信不信由你,有了JDK1.6,你就可以使用内置的Javascript引擎了。定制以满足您的需求。
确保你有这些进口......
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
代码:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String infix = "3+2*(4+5)";
System.out.println(engine.eval(infix));
首先,您需要对字符串进行标记。本质上,将每个元素分开。将操作与单个数字分开,并将它们存储在某些东西(可能是列表)中。然后只需根据操作顺序进行操作即可。
所以伪代码会是这样的:
public int eval(String infix)
{
create a list of all the elements
identify which operations you would want to do first
perform the operations and simplify the list (e.g. if 5x4 were inside parantheses, remove the parantheses and replace it overall with 20.)
continue the simplification until you have a final result
return the result
}
可能有更好的方法可以做到这一点,但这里有一个解决方案。
static int eval(String infix) {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String stringResult;
try {
stringResult = engine.eval(infix).toString();
double doubleResult = Double.parseDouble(stringResult);
int result = (int) doubleResult;
return result;
} catch (ScriptException ex) {
Logger.getLogger(Ukol4a.class.getName()).log(Level.SEVERE, null, ex);
}
return(1);
}