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);
                    }
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HERODING77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值