题目描述:
给你一个以字符串形式表述的 布尔表达式(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 是以上述形式给出的有效表达式,表示一个布尔值。
思路:
对于这种表达式解析问题,我们可以使用栈来辅助解决。
从左到右遍历表达式 expression,对于遍历到的每个字符c:
如果c是 "tf!&|" 中的一个,我们直接将其入栈;
如果c是右括号 ')',我们将栈中元素依次出栈,直到遇到操作符 '!' 或 '&' 或 '|'。过程中我们用变量t和f记录出栈字符中 't' 和 'f' 的个数。最后根据出栈字符的个数和操作符计算得到新的字符 't' 或 'f',并将其入栈。
遍历完表达式 expression 后,栈中只剩下一个字符,如果是 't',返回 true,否则返回 false。
代码:
class Solution {
public:
bool parseBoolExpr(string expression) {
stack<char> stk;
for (char c : expression) {
if (c != '(' && c != ')' && c != ',') stk.push(c);
else if (c == ')') {
int t = 0, f = 0;
while (stk.top() == 't' || stk.top() == 'f') {
t += stk.top() == 't';
f += stk.top() == 'f';
stk.pop();
}
char op = stk.top();
stk.pop();
if (op == '!') c = f ? 't' : 'f';
if (op == '&') c = f ? 'f' : 't';
if (op == '|') c = t ? 't' : 'f';
stk.push(c);
}
}
return stk.top() == 't';
}
};