如何在C++中将字符串逻辑表达式转换为条件表达式并求值?
在C++中求值字符串形式的逻辑表达式的方法
C++标准库并没有直接提供解析并求值字符串形式逻辑表达式的功能,你需要自己实现解析逻辑,或者借助第三方脚本引擎来完成。下面是两种可行的方案:
1. 手动实现简易逻辑表达式解析器
针对你给出的仅包含0、1、()、&&、||的表达式场景,可以手动实现一个解析器,核心思路是先处理括号内的子表达式,再按运算符优先级(&&高于||)逐步计算。
以下是一个示例实现:
#include <iostream> #include <string> #include <stack> #include <cctype> // 计算无括号的逻辑表达式 bool evaluateSimpleExpr(const std::string& expr) { std::stack<bool> values; std::stack<char> ops; for (size_t i = 0; i < expr.size(); ++i) { char c = expr[i]; if (c == ' ') continue; if (isdigit(c)) { values.push(c == '1'); } else if (c == '&' || c == '|') { // 处理运算符优先级:&& 比 || 高,先算前面的&& while (!ops.empty() && ((ops.top() == '&' && c == '|') || ops.top() == c)) { bool b = values.top(); values.pop(); bool a = values.top(); values.pop(); char op = ops.top(); ops.pop(); bool res = (op == '&') ? (a && b) : (a || b); values.push(res); } ops.push(c); ++i; // 跳过第二个&或| } } // 处理剩余运算符 while (!ops.empty()) { bool b = values.top(); values.pop(); bool a = values.top(); values.pop(); char op = ops.top(); ops.pop(); bool res = (op == '&') ? (a && b) : (a || b); values.push(res); } return values.top(); } // 处理带括号的表达式,递归解析括号内的内容 bool evaluateExpr(std::string expr) { size_t start = expr.find('('); while (start != std::string::npos) { size_t end = start; int count = 1; // 找到匹配的右括号 while (end + 1 < expr.size() && count != 0) { ++end; if (expr[end] == '(') ++count; else if (expr[end] == ')') --count; } // 递归计算括号内的表达式 std::string subExpr = expr.substr(start + 1, end - start - 1); bool subRes = evaluateExpr(subExpr); // 替换括号内容为计算结果(1或0) expr.replace(start, end - start + 1, subRes ? "1" : "0"); start = expr.find('('); } return evaluateSimpleExpr(expr); } int main() { std::string exp = "(1||0)&&(1&&1)&&(1||0&&0)"; bool result = evaluateExpr(exp); std::cout << (result ? "true" : "false") << std::endl; // 输出true return 0; }
这个实现会先递归处理所有括号内的子表达式,将其替换为1或0,然后对剩余的无括号表达式按运算符优先级计算最终结果。
2. 借助嵌入式脚本引擎
如果你的表达式场景更复杂(比如支持变量、更多运算符),可以考虑嵌入像Lua这样的轻量脚本引擎:将字符串形式的逻辑表达式传给脚本引擎执行,再获取返回结果。这种方式无需自己实现复杂的解析逻辑,但需要引入脚本引擎的依赖。
需要注意的是,若表达式来自不可信来源,使用脚本引擎存在安全风险,需做严格的输入校验。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

