【发布时间】:2012-07-02 22:43:32
【问题描述】:
我正在尝试编写一个字符串评估函数,即
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + - / and *
我最初的想法是使用正则表达式来收集运算符和数字,因为它们可以匹配。而不是在找到该信息之后,以某种方式找出一种方法来优先考虑 /* ove -+ 运营商。
我是这样开始的:
static String regex = "([\\+\\*-/])+";
static String digitRegex = "(\\d)+";
public static void main(String[] args) {
System.out.println(getOperators("4 + 1 * 3"));
}
public static List<String> getOperators(String input) {
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(input);
List<String> operatorList = new ArrayList<String>();
int count = 0;
while (matcher.find()){
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
operatorList.add(matcher.group(count));
count++;
}
}
return operatorList;
}
现在我可以编写另一种方法来使用相同的逻辑提取数字。
public static List<Integer> getDigits(String input) {
Pattern p = Pattern.compile(digitRegex);
Matcher matcher = p.matcher(input);
List<Integer> digitList = new ArrayList<Integer>();
int count = 0;
while (matcher.find()) {
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
digitList.add(Integer.valueOf(matcher.group(count)));
count++;
}
}
return digitList;
}
现在是我卡住的部分。 #1 上述方法在第三个示例中失败:
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
而这个 #2 即使我尝试前面的示例,我也无法弄清楚如何将它们按正确的顺序排列。
我是不是在正确的轨道上,有没有人有一些有用的建议请分享?
【问题讨论】:
-
这是一个operator precedence 问题。在递归下降解析器中,您只需从较低优先级运算符下降到较高优先级,然后使用括号运算符跳回顶部。
-
表达式
evaluate("4 + 1 * 3") ;应该返回 7。如果你希望它返回 15,你应该写evaluate("(4 + 1) * 3") ; -
另外,作为一个选项,您可能更喜欢Reverse polish notaion
标签: java evaluation operator-precedence expression-evaluation