给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。
有效的表达式需遵循以下约定:
- “t”,运算结果为 True
- “f”,运算结果为 False
- “!(expr)”,运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
- “&(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 与的运算(AND)
- “|(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 或的运算(OR)
这是一道非常典型的可以使用递归下降分析方法解决的题目。递归下降分析是在编译器进行语法分析的时候常用的一种方法,它的本质依旧是递归,但是逻辑上更加接近人类可以理解的方式。
使用递归下降分析的Java代码如下:
private int index = 0;
private boolean expr(String expression){
if (index > expression.length()) return true;
if (expression.charAt(index) == 't'){
index += 1;
return true;
}
if (expression.charAt(index) == 'f'){
index += 1;
return false;
}
if (expression.charAt(index) == '!'){
index += 2;
boolean ans = expr(expression);
index += 1;
return !ans;
}
if (expression.charAt(index) == '&'){
index += 2;
boolean ans = expr(expression);
while(expression.charAt(index) == ','){
index += 1;
ans = ans & expr(expression);
}
index += 1;
return ans;
}
if (expression.charAt(index) == '|'){
index += 2;
boolean ans = expr(expression);
while(expression.charAt(index) == ','){
index += 1;
ans = ans | expr(expression);
}
index += 1;
return ans;
}
return false;
}
public boolean parseBoolExpr(String expression) {
return expr(expression);
}