​题目链接​

题意

给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。

有效的表达式需遵循以下约定:

“t”,运算结果为 True
“f”,运算结果为 False
“!(expr)”,运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
“&(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 与的运算(AND)
“|(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 或的运算(OR)

思路

类似于表达式求值的题目,用栈来求解。
遍历字符串,

  • 如果当前字符是逗号的话,跳过;
  • 如果当前字符不是右括号,将该字符添加到栈里;
  • 如果是右括号,说明要求值了。遍历前面的字符直到遇到左括号,记录​​t​​​,​​f​​的个数。再根据运算符分类讨论。
  1. 运算符为​​!​​​。当​​f​​​的个数为1时,结果才为​​t​​​;其余结果为​​f​
  2. 运算符为​​&​​​。当​​f​​​的个数为0时,结果才为​​t​​​;其余结果为​​f​
  3. 运算符为​​|​​​。当​​t​​​的个数为0时,结果才为​​f​​​;其余结果为​​t​​ 将结果放入栈里
  • 遍历完成后,如果栈顶字符为​​t​​​说明表达式值为​​true​

代码

class Solution {
public:
bool parseBoolExpr(string expression) {
stack<char>stk;
for(int i=0;i<expression.size();i++){
if(expression[i]==','){
continue;
}else if(expression[i]!=')'){
stk.push(expression[i]);
}else{
int t=0,f=0;
while(stk.top()!='('){
if(stk.top()=='t') t++;
else f++;
stk.pop();
}
stk.pop();
char op = stk.top();stk.pop();
if(op=='!'){
if(f==1) stk.push('t');
else stk.push('f');
}else if(op=='&'){
if(f==0) stk.push('t');
else stk.push('f');
}else if(op=='|'){
if(t==0) stk.push('f');
else stk.push('t');
}
}
}
return stk.top()=='t' ;
}
};
func parseBoolExpr(expression string) bool {
stk := []rune{}
for _,val := range expression {
if val == ','{
continue
}
if val != ')' {
stk=append(stk,val)
continue
}
t := 0
f := 0
for stk[len(stk)-1] != '(' {
ch := stk[len(stk)-1]
if ch == 't' {
t++
}else{
f++
}
stk = stk[:len(stk)-1]
}
stk = stk[:len(stk)-1]
op := stk[len(stk)-1]
stk = stk[:len(stk)-1]
if op == '!' {
if f == 1 {
stk = append(stk, 't')
}else{
stk = append(stk, 'f')
}
}else if op == '&' {
if f == 0 {
stk = append(stk, 't')
}else{
stk = append(stk, 'f')
}
}else if op == '|' {
if t == 0 {
stk = append(stk, 'f')
}else{
stk = append(stk, 't')
}
}
}
return stk[len(stk)-1] == 't'
}