给你一个以字符串形式表述的 布尔表达式(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) {
int n = expression.size();
stack<char> stk;
int i = 1;//测试需要
for(char item : expression)
{
if(item != ',' && item != ')')
{
stk.push(item);
}
else if(item == ')')
{
int tsum = 0, fsum = 0;
while(stk.top() != '(')
{
if(stk.top() == 't')
{
tsum++;
}
else
{
fsum++;
}
stk.pop();
}
stk.pop();//pop '('
if(stk.top() == '!')
{
stk.pop();
if(tsum == 0)
{
stk.push('t');
}
else
{
stk.push('f');
}
}
else if(stk.top() == '&')
{
stk.pop();
if(fsum == 0)
{
stk.push('t');
}
else
{
stk.push('f');
}
}
else if(stk.top() == '|')
{
stk.pop();
if(tsum != 0)
{
stk.push('t');
}
else
{
stk.push('f');
}
}
// cout << "tsum:" << tsum << " fsum:" << fsum << " ------" << i << endl;
}
// //检验部分
// stack<char> temp = stk;
// while(!temp.empty())
// {
// cout << temp.top();
// temp.pop();
// }
// cout << " ----" << i << endl;
// i++;
}
return stk.top() == 't';
}
};
1.可能是许久未做题的缘故,有一些分号忘加。
2.测试代码十分精妙,因为stl中stack不能直接遍历,所以找到一个临时栈来进行逆向遍历,当然也可以正向遍历,再反转一遍就行,比较麻烦
3.注意,因为每个测试用例其实必有括号,所以把所有的反括号消除掉以后就是最终解,一个反括号消去一个正括号,并且最终结果没有逗号,所以就是最终解
4.使用tsum与fsum两个变量十分巧妙,因为和true与false顺序无关,只要统计数量就行