2014-09-18 46 views
0

我在我個人項目中的一個地方,我需要從代表數學表達式的字符串中構建一棵樹。例如,標準C++庫中是否有一個工具,用於通過運算符從數學表達式構建樹?

"5*(3+2^69)+1" 

被內置到

 /    \ 

    5*(3+2^69)   1 
    / \   /\ 
    /  \ 
    5  (3+2^69) 
/\    
      /\ 
     / \ 
     / \ 
     3  2^69 
     /\ /\ 
      / \ 
       2  69 
      /\  /\ 

我已經從頭開始做一個工具,可以計算衍生一旦功能已被組裝成這樣的樹節點

struct functNode 
{ 
    /* 
    Expresses a function fx as 
    fx = gx op hx 
    */ 
    std::string fx, gx, hx; 
    opers op; // enum opers = {PLUS, MINUS, MULT, DIV, EXP}; 

}; 

這是組裝成一棵樹的部分,我掛了。我無法找出一種方法來將一個函數(用一個字符串表示)放入一棵樹中,而不用多次遍歷字符串。無論如何,我只是給你一個關於我在做什麼的想法,這樣我就可以看到你們中的任何一個人能否指引我到一個圖書館,在那裏我可以找到我需要的功能,以便將它們組合在一起。當我在編程方面做得更好時,我會自己製作樹組件。

+0

爲什麼你需要衍生物?我在這裏沒有得到你想要做的。 – RockOnRockOut 2014-09-18 21:11:18

+4

不,在C++標準庫中沒有工具可以做到這一點。 – 2014-09-18 21:12:40

+0

@MatsPetersson另外,你能指導我什麼地方可以教我如何編寫這些程序的理論嗎? – user4055428 2014-09-18 21:24:21

回答

-1

見在C++中的STL集合容器,它通常用於執行二叉搜索樹:

http://www.cplusplus.com/reference/set/set/

+0

但是它不會爲你構建樹。 – 2014-09-18 21:13:30

+0

不,但它是關於你可以在STL中做的最好的。 – commanderdata 2014-09-18 21:16:33

+0

不會讓它成爲答案...... – 2014-09-18 21:19:08

1

你應該看看柔性/野牛(也稱爲YACC),這是‘編譯器生成器’。它們不是STL的一部分,但是免費,你可以在線下載它們。 Flex將輸入字符串「標記化」爲可用塊,而bison(或yacc)將根據您提供的塊/語法執行操作。這裏有很多教程,特別是在數學表達式上做這個。一旦在flex/bison文件中定義了您的語言,您將運行flex/bison,它將生成一個C(或C++)組件來執行您的語言,在您的情況下,您可以爲您的表達式構建樹。

這是相對容易使用,爲你寫一個解析器,並且可能需要一兩天才能工作。更何況它會教你很多關於計算機語言如何工作。

相關問題