Leetcode第1106题:解析布尔表达式(Parsing a boolean expression)

解题思路

看到表达式求解,自然想到栈。
从左至右遍历布尔表达式expression,对于不同类型字符,进行不同操作:

  • 逗号,,跳过该字符;
  • 不是逗号,和右括号),入栈;
  • 如果是右括号),则一个表达式遍历结束,需要解析该表达式的值,并将结果入栈
  1. 出栈,直到栈顶元素是左括号(,然后将左括号(和运算符出栈,记录弹出的tf的个数;
  2. 计算tf的表达式值:
    2.1 运算符是!,表达式的值为括号内的值取反,因此当f的个数为1时表达式的值为t,否则为f
    2.2 运算符是&,当括号内的所有值都是t时结果是t,否则结果是f
    2.3 运算符是|,当括号内至少有一个值是t时结果是t,否则是f

遍历结束后,栈内只有一个字符tf,返回相应值即可。

核心代码如下:

class Solution {
public:
    bool parseBoolExpr(string expression) {
        stack<char> stk;
        int n = expression.size();
        for (int i = 0; i < n; i++) {
            char c = expression[i];
            if (c == ',') {
                continue;
            } else if (c != ')') {
                stk.push(c);
            } else {
                int t = 0, f = 0;
                while (stk.top() != '(') {
                    char val = stk.top();
                    stk.pop();
                    if (val == 't') {
                        t++;
                    } else {
                        f++;
                    }
                }
                stk.pop();
                char op = stk.top();
                stk.pop();
                switch (op) {
                case '!':
                    stk.push(f == 1 ? 't' : 'f');
                    break;
                case '&':
                    stk.push(f == 0 ? 't' : 'f');
                    break;
                case '|':
                    stk.push(t > 0 ? 't' : 'f');
                    break;
                default:
                    break;
                }
            }
        }
        return stk.top() == 't';
    }
};
posted @ 2022-11-05 18:32  hql5  阅读(68)  评论(0)    收藏  举报