我在面试论坛上发现了这一点,并认为这是一个有趣的问题。有没有简单的方法在C ++中完成这个任务?例如,假设我们有函数声明:
bool _transform(string x);
/* x is a combination of (, ), 0, 1, &, and | such that all expressions
start with a open and ending brace, and the function evaluates the
strings actual truth value
*/
有没有有效且相对简单的方法来做到这一点?我想到了递归地关闭括号,但问题似乎很难。
答案 0 :(得分:2)
这只是表达式解析和评估中的一个相当简单的练习,使用逻辑运算符而不是算术运算符。琐事真的。查找'递归下降表达式解析'或Dijkstra Shunting-yard算法。警告:后者有许多本土和其他近似等价物,其中大多数都有微小的错误或非线性性能。使用来源。
注意标题中表达式的值为1.
答案 1 :(得分:2)
此问题的简单解决方案是基于堆栈的解析器。 [递归下降会有点矫枉过正。]
For each character in the string
If it's a value (0 1)
If top of stack is an operator
Pop operator and value, evaluate
Push value on the stack
If it's an operator (&|) push it on the stack
If it's a left parenthesis push it on the stack
If it's a right parenthesis pop the value and the LP, push the value
At end, pop the value off the stack.
需要更多代码才能优雅地处理错误,但您明白了。它也忽略了优先权。
这个概念很容易扩展到任何类型的算术表达式,但是你需要处理优先级以获得正确的答案。实际上,这会将表达式从中缀转换为后缀表示法,并在运行中进行评估。