题目描述:
给你一个以字符串形式表述的 布尔表达式(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 是以上述形式给出的有效表达式,表示一个布尔值。
代码:比较简单的一道题目,使用一个栈即可。
虽然做出来了但是已经过了时间,十二点十三分做出来的…
class Solution {
public static boolean parseBoolExpr(String expression) {
Stack<String> stack2 = new Stack<>();
for (int i = 0; i < expression.length(); i++) {
String tems = String.valueOf(expression.charAt(i));
if(isfuhao(tems)){
stack2.push(tems);
}else if (tems.equals("(")) {
stack2.push(tems);
}else if (tems.equals(",")) {
continue;
}else if (tems.equals(")")) {
boolean tem = get(stack2);
stack2.push(String.valueOf(tem));
}else if (tems.equals("t")) {
stack2.push("true");
}else if (tems.equals("f")) {
stack2.push("false");
}
}
return Boolean.parseBoolean(stack2.pop());
}
public static boolean get(Stack<String> stack){
List<Boolean> list = new ArrayList<>();
while (!stack.peek().equals("(")) {
list.add(Boolean.valueOf(stack.pop()));
}
System.out.println(list);
// 弹出左括号
stack.pop();
// 弹出符号 ! || &&
String getString = stack.pop();
if(getString.equals("!")){
return !list.get(0);
}else if (getString.equals("&")) {
if(list.contains(false)){
return false;
}else {
return true;
}
}else{
if(list.contains(true)){
return true;
}else {
return false;
}
}
}
public static boolean isfuhao(String tem){
if(tem.equals("!") || tem.equals("&") || tem.equals("|")){
return true;
}else {
return false;
}
}
}