[leetcode每日一题]11.5
原创
©著作权归作者所有:来自51CTO博客作者YetiZ的原创作品,请联系作者获取转载授权,否则将追究法律责任
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;
}
};