首页 > 解决方案 > 如何读取一串布尔运算并赋予其优先级?

问题描述

我必须读取这样的文件行

assign x = (c OR (a AND B)) OR (NOT D)

Whereassign是一个激活类方法的关键字Logic_gate,它计算并存储布尔运算的结果。

我从文件中读取了这一行 by ,并用objectgetline读取了这个字符串,但我不知道如何为操作赋予优先级。即我想做第一个括号之间的操作,然后是另一个。sstreamistringstream

在这个例子中,我想要:

-A AND B
-(c OR (a AND B))
-(NOT D)
-(c OR (a AND B)) OR (NOT D)
-Store result in x

标签: c++string

解决方案


听起来好像您正在寻找一种将中缀表达式转换为后缀表示法的方法?这使您可以构建一个非常容易评估的操作堆栈。有一个非常古老的表达式解析器可能不会再编译了,但是它可以进行中缀到后缀的转换(参见 Parse 函数): http ://www.flipcode.com/archives/Expression_Compiler_Evaluator.shtml

如果您知道 or/not/and/() 的运算符优先级,那么它应该非常简单。(您可能会注意到 Parse 函数中 if/else 语句的顺序与 C++ 的运算符优先级相匹配)。

.... 显然我不是建议你把它编译成 x86 机器码!!这只是一些我知道有一些相关性的代码:)

一个非常简单的例子:

// infix
x = A AND B

// postfix
x = A B AND

// to evaluate
A is a variable, push onto stack
B is a variable, push onto stack
AND is a binary op, so compute:
   stack[last - 1] = stack[last - 1] AND stack[last]
pop a value from the stack

// stack now contains 1 value, the result

原来的表达:

// infix
x = (c OR (a AND B)) OR (NOT D)

// postfix
x = A B AND C OR D NOT OR

// evaluated like so:
A is a var, push on stack
B is a var, push on stack
AND - perform op, pop value from stack, store result in stack.top()
C is a var, push on stack
OR - perform op, pop value from stack, store result in stack.top()
D is a var, push on stack
NOT is unary. store !stack.top() in stack.top(). DO NOT POP!
OR - perform op, pop value from stack, store result in stack.top()

// the stack should contain the result. 

推荐阅读