1106. 解析布尔表达式

给你一个以字符串形式表述的 ​​布尔表达式​​​(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​​ 是以上述形式给出的有效表达式,表示一个布尔值。

Solution

用栈模拟即可。这里我建了两个栈,一个用于存储位运算操作,另一个存储'(','t'和'f'。对于这些字符,遍历到它们时直接入栈。当遍历到')'时就出栈到上一个'('的位置。对这些出栈元素进行运算后,入栈即可。

代码(C++)

class Solution {
public:
bool parseBoolExpr(string expression) {
stack<char> st1;
stack<char> st2;
bool cur;
for(int i=0;i<expression.size();i++){
char ch = expression[i];
if(ch=='&'||ch=='|'||ch=='!'){
st1.push(ch);
}
else if(ch=='('||ch=='t'||ch=='f'){
st2.push(ch);
}
else if(ch==')'){
cur = st1.top() == '&' ? true : false;
while(st2.top()!='('){
bool b = st2.top() == 't' ? true : false;
if(st1.top()=='&')cur &= b;
else if(st1.top()=='|')cur |= b;
else if(st1.top()=='!')cur = !b;
st2.pop();
}
st1.pop();
st2.pop();
char c = cur ? 't' : 'f';
st2.push(c);
}
}
return st2.top() == 't' ? true : false;
}
};