今天这道困难题还挺简单的 思路不难 理解了就很好写
表达式的题大部分都用栈来处理
- 首先,遇到 ',' 就跳过
- 如果不是 ' ) ',就压入栈
- 如果遇到 ' ) ',说明一个括号内的值输入完成,此时统计栈中 ' ( ' 之前的 f 和 t 的个数,然后吞掉 ' ( ' 后,下一个弹出栈的值就是运算符,根据运算符的特点和 f、t 的个数判断该子括号内的运算结果,再将结果压入栈,继续下一级括号的运算
- 最后弹出栈的结果看是t还是f
class Solution {
public boolean parseBoolExpr(String s)
{
Deque<Character> st=new ArrayDeque<>();
for(int i=0;i<s.length();i++)
{
char c=s.charAt(i);
if(c==',') continue;
else if(c!=')') st.push(c);
else
{
int f=0,t=0;
while(st.peek()!='(')
{
if(st.pop()=='t') t++;
else f++;
}
st.pop(); //把(弹出
char x=st.pop(); //接收运算符
switch(x)
{
case '&': st.push(f>0?'f':'t');break;
case '|': st.push(t>0?'t':'f');break;
case '!': st.push(f==1?'t':'f');break;
}
}
}
return st.pop()=='t';
}
}