Keshawn_lu's Blog

Leetcode 1106. 解析布尔表达式

字数统计: 446阅读时长: 2 min
2022/11/05 Share

题目简介:

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

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

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

示例 1:

1
2
输入:expression = "!(f)"
输出:true

示例 2:

1
2
输入:expression = "|(&(t,f,t),!(t))"
输出:false

提示:

  • 1 <= expression.length <= 20000
  • expression[i]{'(', ')', '&', '|', '!', 't', 'f', ','} 中的字符组成。
  • expression 是以上述形式给出的有效表达式,表示一个布尔值。

思路:

利用栈,当遇到)时,将栈中对应(之前的元素都存储起来,并与(之前的运算符进行运算,将结果保存至栈中。

遍历完成后,栈顶元素便为结果。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class Solution {
public:

bool solve(vector<char>& temp, char c){

if(c == '&'){

for(auto& item : temp){

if(item == 'f')
return false;
}

return true;
}

if(c == '|'){

for(auto& item : temp){

if(item == 't')
return true;
}

return false;
}

if(c == '!'){

if(temp[0] == 't')
return false;
else
return true;
}

return true;
}

bool parseBoolExpr(string expression) {

stack<char> stk;

for(int i = 0; i < expression.size(); i++){

if(expression[i] == ')'){

vector<char> temp;
while(stk.top() != '('){

temp.push_back(stk.top());
stk.pop();
}
stk.pop(); //去除'('

bool res = solve(temp, stk.top());

stk.pop(); //去除运算符
stk.push((res == true) ? 't' : 'f');
}
else
stk.push(expression[i]);
}

return (stk.top() == 't') ? true : false;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: