检测逻辑电路仿真器中的回路

时间:2016-01-22 16:04:51

标签: c++ pointers

我正在尝试编写一个逻辑门电路模拟器,到目前为止一切正常,除了一件事。我的结构看起来像这样:

struct node
{
    int number;
    bool has_value;
    bool is_input;
    bool value;
    Gate operation;
    node* input1;
    node* input2;
};

程序通过使用递归来计算输出值,因此结构中的任何类型的循环都会混淆一切。我的问题是:我如何检测这样的东西(见图),因为我无法想出任何有用的东西。

circuit

1 个答案:

答案 0 :(得分:1)

解决问题的一个显而易见的方法是在每个节点中包含bool,表示在当前模拟步骤中是否已访问该节点。

您最初想要将此设置为false,例如在构造函数中。

然后,模拟步骤将包括遍历图形一次以清除标记。当且仅当当前设置了标志时,您才会从给定节点进行递归。

然后您将运行模拟步骤。这将以大致相同的方式进行,但逻辑相反。当您访问每个节点时,请检查其visited标志。如果已设置,您可以立即返回(并且您刚刚在图中检测到一个周期)。否则,您设置标志,处理该节点的输入(等等 - 您通常的模拟" stuff"),然后执行递归调用以在其子节点上进行模拟。如果其中任何一个循环回到这个,那么该呼叫将立即返回(因为你已经设置了标志),结束了#34; leg"递归调用。