题目描述:
给你一个以字符串形式表述的 布尔表达式(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 是以上述形式给出的有效表达式,表示一个布尔值。
解题思路:
两个栈,一个记录符号,一个记录运算结果
碰到符号则二者都入栈,碰到t/f进行栈顶符号的运算,碰到')'则弹栈。
代码:
class Solution {
public:
bool parseBoolExpr(string &s) {
stack<char> stc;
stack<bool> stb;
for(int i=0; i<s.length(); i++)
{
if(s[i] == '&' || s[i] == '|' || s[i] == '!')
{
stc.emplace(s[i]);
if(s[i] == '&') stb.emplace(true);
if(s[i] == '|') stb.emplace(false);
if(s[i] == '!') stb.emplace(true);
}
if(s[i] == 't' || s[i] == 'f')
{
if(stc.top() == '&') stb.top() = stb.top() && (s[i]=='t'?true:false);
if(stc.top() == '|') stb.top() = stb.top() || (s[i]=='t'?true:false);
if(stc.top() == '!') stb.top() = !(s[i]=='t'?true:false);
}
if(s[i] == ')')
{
char nc = stc.top(); stc.pop();
bool nb = stb.top(); stb.pop();
if(stb.empty()) return nb;
if(stc.top() == '&') stb.top() = stb.top() && nb;
if(stc.top() == '|') stb.top() = stb.top() || nb;
if(stc.top() == '!') stb.top() = !(nb);
}
}
return stb.top();
}
};
提交结果:
![](https://img-blog.csdnimg.cn/63d7b3eb0dbd4bb588fa6702c070ace4.png)