LeetCode 1106 解析布尔表达式[栈] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1106 解析布尔表达式[栈] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
文章目录
思路
读罢题目很容易联想到计算器的操作,思路都是一样的,只不过不是加减乘除,也不是简单的数字了,变成了更简单的bool运算和bool值,那么我们可以考虑用同样的方法,即双栈,一个栈存储运算符,一个栈存储bool值。
解题方法
根据思路,首先遍历整个表达式,遇到操作符就存在操作栈中,遇到布尔值就以0和1存在计算栈中,为了更好计算,对于输入的’(‘,标记为-1作为计算的分隔线,当遇到’)'时,开始计算,拿到操作栈顶的操作符,对计算栈中分割线-1以上的所有元素进行计算,计算完毕把分隔符pop出来,再把当前的计算结果放入。最后计算栈中只剩下一个元素,即最终的计算结果,返回即可。
复杂度
-
时间复杂度: O ( n ) O(n) O(n),即遍历一遍表达式。
-
空间复杂度: O ( n ) O(n) O(n),空间复杂度主要取决于栈空间,栈内字符个数不超过 n n n。
Code
class Solution
public:
bool parseBoolExpr(string expression)
// 算符栈
stack<char> opertion;
// 计算栈
stack<int> s;
for(int i = 0; i < expression.size(); i ++)
// 左括号标记为-1作为计算的分割线
if(expression[i] == '(')
s.push(-1);
else if(expression[i] == 'f' || expression[i] == 't')
s.push(expression[i] == 'f' ? 0 : 1);
else if(expression[i] == '!' || expression[i] == '&' || expression[i] == '|')
opertion.push(expression[i]);
else if(expression[i] == ')')
if(!opertion.empty())
char op = opertion.top();
opertion.pop();
if(!s.empty())
int temp = s.top();
s.pop();
if(op == '!')
temp = abs(temp - 1);
else if(op == '&')
while(!s.empty() && s.top() != -1)
temp *= s.top();
s.pop();
else
while(!s.empty() && s.top() != -1)
temp |= s.top();
s.pop();
s.pop();
s.push(temp);
以上是关于LeetCode 1106 解析布尔表达式[栈] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 1106. Parsing A Boolean Expression
LeetCode:Database 98.计算布尔表达式的值