与波兰表达式类似,利用2个栈,一个存数字,一个存运算符。
略有不同的是,四则运算都是双目运算符,每次计算都是弹出2个数字与1个运算符,结果再压入数字栈中。
但是此题的运算符(或与)都是多目运算符,遇到)
要一直弹出到(
,用两个变量记录是否出现t或f,
对于&,只要出现false结果就是false
对于|,只要出现true结果就是true
对于!,出现false结果就是true
class Solution {
public:
bool parseBoolExpr(string expression) {
stack<char> ops, exps;
for(char c:expression){
if(c=='!' || c=='&' || c=='|'){
ops.push(c);
}else if(c=='t' || c=='f' || c=='('){
exps.push(c);
}else if(c==')'){
bool t=false,f=false;
while(exps.top()!='('){
char exp = exps.top();
exps.pop();
if(exp == 't')
t=true;
else
f=true;
}
exps.pop();//弹出'('
char op = ops.top();
ops.pop();
if(op == '&'){
exps.push(f?'f':'t');//只要出现false结果就是false
}else if(op == '|'){
exps.push(t?'t':'f');//只要出现true结果就是true
}else if(op == '!'){
exps.push(f?'t':'f');//出现false结果就是true
}
}
}
return exps.top()=='t';
}
};