task
给你一个以字符串形式表述的 布尔表达式(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
提示:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/parsing-a-boolean-expression
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
code
package Algorithm.LeetCode.parseBoolExpr;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
/**
* @author yangyiliy_liuyang
* 2022/11/5
* @version 1.0
* 1106. 解析布尔表达式
*/
public class Main {
public static void main(String[] args) {
boolean b = parseBoolExpr("|(f,t)");
System.out.println(b);
}
public static boolean parseBoolExpr(String expression) {
/*
*/
Deque<Character> st = new ArrayDeque<>();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(' || c == ',') {
continue;
}
if (c == ')') {
List<Boolean> list = new ArrayList<>();
while (st.peek() == 't' || st.peek() == 'f') {
list.add(st.poll() == 't' ? true : false);
}
char t = st.poll();
boolean ans = list.get(0);
if (t == '!') {
ans = !ans;
}
if (t == '&') {
for (int j = 1; j < list.size(); j++) {
ans &= list.get(j);
}
}
if (t == '|') {
for (int j = 1; j < list.size(); j++) {
ans |= list.get(j);
}
}
st.push(ans ? 't' : 'f');
} else {
st.push(c);
}
}
return st.peek() == 't' ? true : false;
}
}