模拟:
逆序处理字符串。
入栈情况:当且仅当元素为' 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为表达式的长度。