2020-4 leetcode 1106. 解析布尔表达式

1.关键点:1.找到最小的处理单位,然后借助递归一层层的去处理。
注意有个坑:当借助栈来获得对应处理单位的操作符时 ,因为一个处理单位会有多个操作符 进栈,所以需要借助fg 使得多余的操作符出栈,最终使得操作符与其对应的处理单位对应正确。

#include<iostream>
class Solution {
public:
    bool parseBoolExpr(string expression) {
        char stau=expression[0];
        bool ans;
        int count=0,fg=0;
        for(int i=1;i<expression.size();i++){
            if(expression[i]=='('){
                count++;
                fg++;
            }else if(expression[i]==')'){
                count--;
            }
            if(count==0){
                fg--;
                int n=expression.size();
                string s1=expression.substr(2,n-3);
                
                ans=back(s1,fg,stau);
            }
        }        
        return ans;
        
    }
    
    bool back(string s1,int fg1,int stau1){
        queue<char> qu;
        vector<bool> date;
        cout<<s1<<endl;
        if(fg1==0){
            for(int i=0;i<s1.size();i++){
                if(s1[i]=='t') date.push_back(true);
                else if(s1[i]=='f') date.push_back(false);
            }
        }
        else{
            int count=0,fg=0;
            int l,r,i=0;                      
            for(i=0;i<s1.size();i++){

                if(s1[i]=='('){
                    if(fg==0) l=i;
                    count++;
                    fg++;
                }
                else if(s1[i]==')'){
                    count--;
                    r=i;
                }
                else if(s1[i]=='!'||s1[i]=='|'||s1[i]=='&'){
                    qu.push(s1[i]);
                }         
                if(count==0&&fg){
                   
                    fg--;                   
                    string s = s1.substr(l+1,r-l-1);            
                    char stau=qu.front();
                    qu.pop();
                    for(int i=0;i<fg;i++) qu.pop();
                    
                    bool ans=back(s,fg,stau);
                    date.push_back(ans);
                    fg=0;
                    
                }
             
            }                  
        }
        cout<<s1<<stau1<<" "<<date.size()<<endl;
        for(int i=0;i<date.size();i++) cout<<date[i]<<" ";
        cout<<endl;
        if(stau1=='!'){  
            date[0]=!date[0];
        }
        else if(stau1=='|') {
            for(int i=1;i<date.size();i++){
                cout<<date[i]<<" ";
                date[0]=date[0]|date[i];
                cout<<date[0]<<endl;
            } 
        }else if(stau1=='&'){
            for(int i=1;i<date.size();i++) date[0]=date[0]&date[i];
        }       
        return date[0];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值