问题描述:
给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。
有效的表达式需遵循以下约定:
"t",运算结果为 True
"f",运算结果为 False
"!(expr)",运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
"&(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 与的运算(AND)
"|(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 或的运算(OR)
示例 1:
输入:expression = "!(f)"
输出:true
示例 2:
输入:expression = "|(f,t)"
输出:true
示例 3:
输入:expression = "&(t,f)"
输出:false
示例 4:
输入:expression = "|(&(t,f,t),!(t))"
输出:false
提示:
1 <= expression.length <= 20000
expression[i] 由 {'(', ')', '&', '|', '!', 't', 'f', ','} 中的字符组成。
expression 是以上述形式给出的有效表达式,表示一个布尔值。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/parsing-a-boolean-expression
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解决方案:
操作数栈存入 t、f和左括号
操作符栈存入 |、&和!
遇到右括号时,将操作数栈中的元素依次出栈,直到遇到左括号停止,再从操作符栈中出栈一个操作符计算
class Solution {
public boolean parseBoolExpr(String expression) {
ArrayDeque<Character> stackOperand = new ArrayDeque<>();
ArrayDeque<Character> stackOperator = new ArrayDeque<>();
char[] chars = expression.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == 't' || chars[i] == 'f' || chars[i] == '(') {
stackOperand.push(chars[i]);
} else if (chars[i] == '|' || chars[i] == '&' || chars[i] == '!') {
stackOperator.push(chars[i]);
} else if (chars[i] == ')') {
int trueCount = 0;
int falseCount = 0;
while (!stackOperand.isEmpty()) {
char pop = stackOperand.pop();
if (pop == 't') {
trueCount++;
} else if (pop == 'f') {
falseCount++;
} else if (pop == '(') {
break;
}
}
char operator = stackOperator.pop();
if (operator == '!') {
stackOperand.push(trueCount == 0 ? 't' : 'f');
} else if (operator == '&') {
stackOperand.push(falseCount > 0 ? 'f' : 't');
} else if (operator == '|') {
stackOperand.push(trueCount > 0 ? 't' : 'f');
}
}
}
return stackOperand.pop() == 't' ? true : false;
}
}