有效地解析单个数字算术表达式

您将如何有效地(优化运行时但最小化空间)解析并评估Java中的单个数字算术表达式。

以下算术表达式都是有效的:

eval("-5")=-5 eval("+4")=4 eval("4")=4 eval("-7+2-3")=-8 eval("5+7")=12 

我的方法是迭代所有元素,使用标志跟踪当前算术运算,并逐位评估。

 public int eval(String s){ int result = 0; boolean add = true; for(int i = 0; i < s.length(); i++){ char current = s.charAt(i); if(current == '+'){ add = true; } else if(current == '-'){ add = false; } else { if(add){ result += Character.getNumericValue(current); } else { result -= Character.getNumericValue(current); } } } return result; } 

这是唯一的最佳解决方案吗? 我试图使用堆栈来跟踪算术运算符,但我不确定这是否更有效。 我还没有尝试过正则表达式。 我只是问,因为我在一次采访中给出了上述解决方案,并被告知这是次优的。

这似乎更紧凑。 它当然需要更少的线条和条件。 关键是添加是“默认”行为,您遇到的每个减号都会更改您要添加的内容的符号; 如果你记得在每次加入后重置标志。

 public static int eval(String s){ int result = 0; int sign = 1; for(int i = 0; i < s.length(); i++){ char current = s.charAt(i); switch (current) { case '+': break; case '-': sign *= -1; break; default: result += sign * Character.getNumericValue(current); sign = 1; break; } } return result; } 

作为一个注释,我不认为你的产生正确的结果添加负面,例如“4--3”。 你的代码产生1,而不是7的正确值。另一方面,我允许表达式如“5 + - + - 3”,这将产生结果8(我想这是正确的?:)。 但是,您没有将validation列为要求,我们都没有检查连续数字,字母字符,空格等。如果我们假设数据格式正确,则上述实现应该有效。 我没有看到添加数据结构(如队列)在这里可能会有所帮助。 我也假设只是加法和减法。

这些测试用例产生以下结果:

 System.out.println(eval("1+2+3+4")); System.out.println(eval("1--3")); System.out.println(eval("1+-3-2+4+-3")); 10 4 -3 

您需要查找’递归下降表达式解析器’或Dijkstra shunting-yard算法。 当你必须应对运算符优先级或括号时,你现在的方法注定要失败。 您还需要忘记正则表达式并辞职,以编写合适的扫描仪。