1106. 解析布尔表达式/C++

1106. 解析布尔表达式/C++_第1张图片
与波兰表达式类似,利用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';
    }
};

你可能感兴趣的:(栈,LeetCode/C++)