题目简介:
给你一个以字符串形式表述的 布尔表达式(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; } };
|