给你一个以字符串形式表述的 布尔表达式(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:
bool parseBoolExpr(string expression) {
stack<char> st1;
for(int i=0; i<expression.size(); i++) {
char c = expression[i];
if(c == ')') {
int t = 0, f = 0;
char d = st1.top();
while(d != '(') {
if(d == 't') t++;
if(d == 'f') f++;
st1.pop();
d = st1.top();
}
st1.pop();
char p = st1.top();
if(p == '!') {
if(!t) st1.push('t');
else st1.push('f');
}
if(p == '&') {
if(!f) st1.push('t');
else st1.push('f');
}
if(p == '|') {
if(!t) st1.push('f');
else st1.push('t');
}
}
else if(c != ',') st1.push(c);
}
if(st1.top() == 't') return true;
else return false;
}
};
class Solution {
public boolean parseBoolExpr(String expression) {
Stack<Character> s = new Stack<>();
for(char ch:expression.toCharArray()){
if(ch==')'){
int count_t=0,count_f=0;
char p = s.pop();
while(p!='('){
if(p=='t') count_t++;
if(p=='f') count_f++;
p = s.pop();
}
char op = s.pop();
if(op=='!'){
s.add(count_t==0?'t':'f');
}else if(op=='|'){
s.add(count_t==0?'f':'t');
}else if(op=='&'){
s.add(count_f==0?'t':'f');
}
}
else if(ch!=',') s.add(ch);
}
return s.pop()=='t'?true:false;
}
}