给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。
有效的表达式需遵循以下约定:
"t",运算结果为 True
"f",运算结果为 False
"!(expr)",运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
"&(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 与的运算(AND)
"|(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 或的运算(OR)
输入:expression = "!(f)" 输出:true
输入:expression = "|(f,t)" 输出:true
输入:expression = "|(f,t)" 输出:true
输入:expression = "|(&(t,f,t),!(t))" 输出:false
主要思路就是先声明两个栈,一个放运算符,一个放括号和要运算的数据,然后不断的遍历字符串,要是碰到)就把(之前的数据进行计算。
class Solution {
public:
//用来装运算符号,也就是&,|,!
stack<char>fu;
//用来装数据
stack<char>zhi;
//函数名
bool parseBoolExpr(string expression) {
//记录一共有几个数据
int n=expression.size();
for(int i=0;i<n;i++)
{
//用来判断是不是运算符,如果是的话就入栈
if(expression[i]=='!'||expression[i]=='&'||expression[i]=='|')
{
fu.push(expression[i]);
}
//判断是不是一个),如果是的话就要把上一个(之前的数据都进行运算
else if(expression[i]==')')
{
//判断 t 和 f 有没有
int ff=0,tt=0;
//记下需要的运算符
char fuhao=fu.top();
fu.pop();
//不断的把需要的数据进行判断是不是t或者f,如果是就让tt或是ff变成1
while(zhi.size()>0)
{
char hao=zhi.top();
zhi.pop();
if(hao=='(')
break;
else if(hao=='t')
tt=1;
else if(hao=='f')
ff=1;
else
continue;
}
//依据不同的运算符进行不同的运算,结果放到zhi里面,方便下次运算
if(fuhao=='!')
{
swap(ff,tt);
if(ff==1)
zhi.push('f');
else if(tt==1)
zhi.push('t');
}
if(fuhao=='&')
{
if(ff==1)
zhi.push('f');
else
zhi.push('t');
}
if(fuhao=='|')
{
if(tt==1)
zhi.push('t');
else
zhi.push('f');
}
}
//跳过逗号
else if(expression[i]==',')
{
continue;
}
else
{
zhi.push(expression[i]);
}
//*/
}
if(zhi.top()=='t')
{
return true;
}
return false;
}
};