2015-07-12 59 views
1

我想用圓括號解決複合命題,併爲它畫出電路。複合命題的繪圖電路

我的問題是,我不知道哪個算法是正確的算法。我嘗試了抽象語法樹,但沒有結論。 也許反向波蘭符號是用圓括號解決複合命題的正確方法,但我應該在每個級別上繪製一個電路,逆波蘭符號只是給出最終答案。

例子:

Example

**我想它

The way i think about it

+1

向我們展示,您到目前爲止得到了什麼。由於樹(你在第二個鏈接中提供的)幾乎是你想要的圖(只是用不同的圖像替換一些節點,並且你完成了),AST對我來說似乎是明智的。 – Turing85

+0

你問的問題應該是完整的,不必遵循鏈接(至少對於主要想法)。另外,當問問題時,請用正確的英文寫(i => I,...) - 它使事情變得更容易閱讀。 – tucuxi

+0

AST和RPN不是「算法」 - 算法是一個配方,AST代表一個分析樹,而RPN是一個(後綴)符號,允許輕鬆進行基於堆棧的表達式評估。 – tucuxi

回答

0

如下我會分解你的問題的方法**:

  • 編寫可將表達式解析爲AST的代碼。
  • 編寫代碼來繪製每個給定的最小AST節點的電路符號:NOT,OR,AND,XOR從~AA|BA&BA^B,分別
  • 編寫代碼來繪製整個解析樹。

你的AST節點可能看起來像:

public interface CircuitNode { 
    // parsing-related 
    String getExpression();  
    List<String> getInputNames(); 
    List<CircuitNode> getChildren();  
    String getOutputName(); 

    // drawing-related; call children to compute things and draw children 
    int calculateHeight(); 
    int calculateWidth(); 
    void draw(Graphics2D g, int x, int y); 

    // simulate circuit, if you need it 
    boolean simulate(boolean[] inputs); 
} 

如果按照分解步驟中,您將首先實現CircuitNode接口的解析相關的部分(不需要圖紙)。然後,您將嘗試draw簡單節點(那些不包含其他節點的簡單節點),這將返回例如100對於calculateWidth和50對於calculateHeight。最後,您將嘗試繪製更大的表達式,其中calculateHeight,calculateWidthdraw的實現將使用遞歸繪製多節點電路。