Leetcode1106-解析布尔表达式

3 篇文章 0 订阅

模拟:

逆序处理字符串。

入栈情况:当且仅当元素为' f '、' t '、' ) '三种情况将它们入栈。

出栈情况:当且仅当元素为' & '、' | '、' ! '三种情况是考虑出栈处理布尔表达式。主要细节是处理这三个运算。

①&:初始化msk为1,不断将栈顶的0、1元素与它进行&运算,直到栈顶元素为' ) '表示括号内的布尔表达式处理完成,将msk放入栈中即可。

②|:初始化msk为0,不断将栈顶的0、1元素与它进行|运算,和&运算一样,遇到' ) '时终止运算,把msk放入栈中即可。

③!:处理是一样的逻辑,因为!处理的只会有一个元素,将元素取反赋给msk,然后弹出后面一位的' ) ',将msk入栈。

class Solution {
public:
    bool parseBoolExpr(string e) {
        stack<char> st;
        int n=e.size();
        for(int i=n-1;~i;i--){
            int msk;
            if(e[i]=='!'){
                while(!st.empty()){
                    char op=st.top();
                    if(st.top()=='0') msk=1;
                    if(st.top()=='1') msk=0;
                    st.pop();
                    if(op==')') break;
                }
                st.push(msk+'0');
            }else if(e[i]=='&'){
                msk=1;
                while(!st.empty()){
                    char op=st.top();
                    if(st.top()=='0') msk=0;
                    st.pop();
                    if(op==')') break;
                }
                st.push(msk+'0');
            }else if(e[i]=='|'){
                msk=0;
                while(!st.empty()){
                    char op=st.top();
                    if(st.top()=='1') msk=1;
                    st.pop();
                    if(op==')') break;
                }
                st.push(msk+'0');
            }else if(e[i]=='f') st.push('0');
            else if(e[i]=='t') st.push('1');
            else if(e[i]==')') st.push(e[i]);
        }
        return st.top()=='1';
    }
};

时间复杂度:O(n)。

空间复杂度:O(n),n为表达式的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值