要求是前缀运算符将像AND(a,b)
,OR(a,b)
或NOT(a)
到中缀,这样的:(a && b)
,(a || b)
,(!(a))
前缀中缀使用Java
我已经写了下面的代码,但它的作品,如果表达ISN”太复杂了。我能够转换: AND(OR(1<2, OR(3<4, 1<2, FUNC(5<6, 2<3))), 2<3)
到
(((1<2 || ((3<4 || (1<2 || FUNC(5<6, 2<3))))))&& 2<3))
除了那些额外的括号外,这个表达式是可以接受的。但是当我运行这个表达式的代码有点复杂时,它里面有太多的函数和括号,或者失败或者返回表达式。例如这个表达式: AND(OR((NOT(A != null)), OR(FUNC(3<4, 1==1), 1<2, FUNC(5<6, 2<3))), 2<3)
它应该忽略除了And/Or/Not之外的其他函数。例如FUNC(5<6, 2<3)
应输出为FUNC(5<6, 2<3)
,正如我在上面的例子中提到的那样。
代码:
public String ConvertToJS(String sExpr, String Operator)
{
//String subExpr[] = sExpr.split(",");
sExpr = sExpr.trim();
String resolved = "";
String resolved2 = "";
if(sExpr.indexOf(",") != -1 || sExpr.indexOf("(") != -1)
{
if((sExpr.indexOf(",") != -1 && sExpr.indexOf("(") != -1 && sExpr.indexOf(",") < sExpr.indexOf("(")) || sExpr.indexOf("(") == -1)
{
if(sExpr.indexOf(",") > 0)
{
if("AND".equalsIgnoreCase(Operator))
return "(" + sExpr.substring(0, sExpr.indexOf(",")) + " && " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else if("OR".equalsIgnoreCase(Operator))
return "(" + sExpr.substring(0, sExpr.indexOf(",")) + " || " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else
return sExpr;
}
else
{
if("AND".equalsIgnoreCase(Operator))
return " && " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else if("OR".equalsIgnoreCase(Operator))
return " || " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else
return sExpr;
}
}
else
{
if(sExpr.indexOf("(") < 2)
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else if(sExpr.indexOf("(") == 2)
{
if(sExpr.substring(0, sExpr.indexOf("(")).equalsIgnoreCase("OR"))
{
resolved = "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "OR") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
}
else if(sExpr.indexOf("(") == 3)
{
if(sExpr.substring(0, sExpr.indexOf("(")).equalsIgnoreCase("AND"))
{
resolved = "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "AND") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else if(sExpr.substring(0, sExpr.indexOf("(")).equalsIgnoreCase("NOT"))
{
resolved = "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "NOT") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
}
else
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
}
}
else
{
if("NOT".equalsIgnoreCase(Operator))
return " !(" + sExpr + ") ";
else
return sExpr;
}
}
[前缀中缀转换算法与图]可能重复(http://stackoverflow.com/questions/4374388/prefix-to-infix-conversion-algorithm-with-figure) –
@JulienLopez,谢谢,但我检查发布Q之前的网站。他正在使用Stack。我不是。 – Enthusiastic
@Enthusiastic尽管你的代码没有明确的引用栈,但你仍然通过递归来使用它。 – dasblinkenlight