LeetCode 1106 解析布尔表达式[栈] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1106 解析布尔表达式[栈] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

文章目录

思路

读罢题目很容易联想到计算器的操作,思路都是一样的,只不过不是加减乘除,也不是简单的数字了,变成了更简单的bool运算和bool值,那么我们可以考虑用同样的方法,即双栈,一个栈存储运算符,一个栈存储bool值。

解题方法

根据思路,首先遍历整个表达式,遇到操作符就存在操作栈中,遇到布尔值就以0和1存在计算栈中,为了更好计算,对于输入的’(‘,标记为-1作为计算的分隔线,当遇到’)'时,开始计算,拿到操作栈顶的操作符,对计算栈中分割线-1以上的所有元素进行计算,计算完毕把分隔符pop出来,再把当前的计算结果放入。最后计算栈中只剩下一个元素,即最终的计算结果,返回即可。

复杂度

  • 时间复杂度: O ( n ) O(n) O(n),即遍历一遍表达式。

  • 空间复杂度: O ( n ) O(n) O(n),空间复杂度主要取决于栈空间,栈内字符个数不超过 n n n

Code


class Solution 
public:
    bool parseBoolExpr(string expression) 
        // 算符栈
        stack<char> opertion;
        // 计算栈
        stack<int> s;
        for(int i = 0; i < expression.size(); i ++) 
            // 左括号标记为-1作为计算的分割线
            if(expression[i] == '(') 
                s.push(-1);
             else if(expression[i] == 'f' || expression[i] == 't') 
                s.push(expression[i] == 'f' ? 0 : 1);
             else if(expression[i] == '!' || expression[i] == '&' || expression[i] == '|') 
                opertion.push(expression[i]);
             else if(expression[i] == ')') 
                if(!opertion.empty()) 
                    char op = opertion.top();
                    opertion.pop();
                    if(!s.empty()) 
                        int temp = s.top();
                        s.pop();
                        if(op == '!') 
                            temp = abs(temp - 1);
                         else if(op == '&') 
                            while(!s.empty() && s.top() != -1) 
                                temp *= s.top();
                                s.pop();
                             
                         else 
                            while(!s.empty() && s.top() != -1) 
                                temp |= s.top();
                                s.pop();
                             
                        
                        s.pop();
                        s.push(temp);
                    
                
            
        

以上是关于LeetCode 1106 解析布尔表达式[栈] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 1106. Parsing A Boolean Expression

LeetCode刷题日记精选例题(解析+代码+链接)

LeetCode:Database 98.计算布尔表达式的值

LeetCode:Database 98.计算布尔表达式的值

LeetCode(数据库)- 计算布尔表达式的值

用正则表达式解析布尔算术,包括括号?