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];
}
};