逻辑表达式一般是这个格式的
2635|H|{}|1|2905=1,290=0,(2901=1+2902=1)!
分析这一段:2905=1,290=0,(2901=1+2902=1)
这里逗号表示and,加号表示or
2905=1 表示2905刀闸设备在合位
290=0 表示290开关在分位
2901=1 表示2901开关在合位
2902=1表示2902刀闸在合位
整个句子表示合2635刀闸时,要判断 2905在合位,且290在分位, 且2901或2902至少有一个在合位
AB(C+D)
现在罗工在工程中有一个需求:当一个设备被删除时,在逻辑表达式中对应的设备编号要被删除掉,而又要保持逻辑表达式的合法性。
比方
A+BC 当B被删除时,表达式变成 A+C
(A+B)C 当B被删除时,表达式变成AC
请你完成这个函数的实现。
为了简单起见,在这个函数里,我们只使用+和两种算符,没有上述的等号,被删除的直接就是运算数/变量, 比方前面的B
//src 原表达式
//set2Del 将要被删除的设备清单
/dst 完成删除处理后的合法表达式
void delExp(const string& src, set& set2Del, string& dst );
编辑工具:QT console application的形式
语言:c++
望采纳
void delExp(const string& src, set& set2Del, string& dst)
{
stack stk; // 用来处理表达式的栈
// 从左到右扫描表达式
for (int i = 0; i < src.length(); i++)
{
if (src[i] == '+') // 如果遇到运算符
{
// 弹出栈顶的两个元素
string op1 = stk.top();
stk.pop();
string op2 = stk.top();
stk.pop();
// 根据运算符和运算数进行运算,并将结果压入栈中
string result = op1 + "+" + op2;
stk.push(result);
}
else if (src[i] == '*') // 如果遇到运算符
{
// 弹出栈顶的两个元素
string op1 = stk.top();
stk.pop();
string op2 = stk.top();
stk.pop();
// 根据运算符和运算数进行运算,并将结果压入栈中
string result = op1 + "*" + op2;
stk.push(result);
}
else if (!set2Del.contains(src[i])) // 如果遇到的是变量,且不在被删除的列表中
{
// 将变量压入栈中
string var = src[i];
stk.push(var);
}
}
// 将栈顶元素返回,即为处理完删除操作后的表达式
dst = stk.top();
}