1106. 解析布尔表达式 ------ 使用栈处理带括号表达式、switch case

给你一个以字符串形式表述的 布尔表达式(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) {
        stack<char>stk; // 声明一个栈,使用栈处理 带有()的运算十分简便
        for (int i = 0;i < expression.size();i++){ // 对字符串进行遍历
            char token = expression[i];
            if (token == ','){ // 如果字符为 “,” 则跳过该逗号
                continue;
            }
            else if (token != ')'){ // 只要字符不是‘ )’ 就push压入栈
                stk.push(token);
            }
            else{ // 如果字符为 ) 说明一个带括号的 bool 表达式已经全部入栈
                int t = 0, f = 0; // 设置计数器记录 t 和 f 字符出现的次数
                while (stk.top() != '('){ // 检查栈顶元素,如果不是( 那么进行接下来的操作
                    char value =  stk.top();
                    if (value == 't'){ // 检查是否为 t 是就++
                        t++;
                    }
                    if (value == 'f'){ // 检查是否为 f 是就++
                        f++;
                    }
                    stk.pop();// pop出栈该元素
                }
                // 栈顶元素为( 时,说明括号内元素已经检查完毕,退出循环
                stk.pop(); // 先出栈(
                char op = stk.top(); // 括号外 是bool表达式的操作符operator
                stk.pop(); // 出栈这个操作符
                switch(op){ // 分别对“取反符号!”、“与符号&”、“或符号|”进行操作
                    case'!':
                        stk.push(f == 1? 't' : 'f'); // 当 只有一个f时,取t
                        break;                      
                    case'&':
                        stk.push(f == 0? 't' : 'f'); // 当没有f时(全是t),取t
                        break;
                    case'|':
                        stk.push(t == 0? 'f' : 't'); // 当没有t时(全是f),取f
                        break;
                    defult:
                        break;
                }
            }
        }
        return stk.top() == 't'; // 最后要输出一个判断 bool值
    }
};

 

 

posted @ 2022-11-05 20:29  slowlydance2me  阅读(69)  评论(0编辑  收藏  举报