我有一个实现这个目标的程序:
Input: "(-123)+(200)" -> String
Output: 77 -> Int
Input: "((-123)+(200))*((2)+(1))"
Output: 231
嗯,我有代码,但我不知道使用正则表达式是否是个好主意。老师给了我一个分隔字符串的函数,例如:
int n = StringUtils.exprMainOperator ("(-123)+(200)");
n = 7;
我的想法是用'n'将每个String分隔成一个子字符串,但我不知道如何递归地实现这个。任何的想法?不在代码中,所以我可以学习,谢谢。
答案 0 :(得分:2)
有很多方法可以实现它,这是一些可行的伪代码。我假设你只有算术运算符,而StringUtils.exprMainOperator
处理操作的括号/优先级:
public static int evaluateExpression(String exp) {
if(exp.charAt(0) == '(' && exp.charAt(exp.length()-1) == ')'
&& /*These two parenthesis correspond to each other*/) return evaluateExpression(exp.substring(1, exp.length()-1));
if(/*is Valid Number*/) return Integer.parseInt(exp);
int n = StringUtils.exprMainOperator(exp);
char op = exp.charAt(n);
String preop = exp.substring(0, n), postop = exp.substring(n+1);
if(op == '+') return evaluateExpression(preop) + evaluateExpression(postop);
if(op == '-') return evaluateExpression(preop) - evaluateExpression(postop);
if(op == '*') return evaluateExpression(preop) * evaluateExpression(postop);
if(op == '/') return evaluateExpression(preop) / evaluateExpression(postop);
//You shouldn't reach this part of the code
return -1;
}
答案 1 :(得分:0)
//Here are the imports you need
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public static void main (String args [])
{
Scanner in = new Scanner (System.in);
in = /*your input*/;
System.out.println(StringEngineCalc(in));
}
public static String StringEngineCalc(String yourString) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String calc= "";
try {
calc = engine.eval(message).toString();
} catch (ScriptException e) {
System.out.println("Error al realizar el cálculo.");
}
return calc;
}
这里你是一个给你一个String的类(如果你想要一个String,如果不是只是删除“toString”并用calc来改变public static int的公共静态字符串。
它使用javascript来解决数学问题,它就像制作计算器的最简单方法一样:)