2009-08-08 39 views
1

我有以下代码。我构建了一个表达式树,我被困解析它找到的结果帮助解析我自己的表达式树,C#

你会发现我的代码

public enum OpertaionType { add, sub, div, mul} 

public class Node { 
    public Node(Node lhs, Node rhs, OpertaionType opType, int index) { 
     this.lhs = lhs; 
     this.rhs = rhs; 
     this.opType = opType; 
     this.index = index; 
    } 
    Node lhs; 
    Node rhs; 
    OpertaionType opType; 
    int index; 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     // I don't want this to be part of the node data structure 
     // because in the actual implementation I will end up referencing an 
     // array of data 

     int[] value = new int[5]; 

     Node[] nodes = new Node[value.Length]; 
     for (int i = 0; i < value.Length; i++) 
     { 
      value[i] = i+1; 
      nodes[i] = new Node(null, null, 0, i); 
     } 



     // suppose I constructed the tree like that 
     // note that the end nodes are marked by non-negative index that indexes the 
     // values array 

     Node a = new Node(nodes[0], nodes[1], OpertaionType.add, -1); 
     Node b = new Node(nodes[2], a, OpertaionType.mul, -1); 
     Node c = new Node(b, nodes[3], OpertaionType.div, -1); 

     // How can I find the result of Node c programatically 
     // such that the result is (a[2]*(a[0]+a[1]))/a[3] = 9/4 

    } 
} 
+0

这功课吗? – 2009-08-08 16:41:34

+0

heyy坚持..你可能会在这里分享你的惊人知识! – mustafabar 2009-08-08 16:45:44

+0

没有马丁它不是 – mustafabar 2009-08-08 16:49:46

回答

1

内的细节对于一个简单的基本介绍到C#3.0本身的表达式树,例如见here;不幸的是,我不知道关于这个主题的真正广泛和深刻的文本(也许是一本书..?)。

至于你自己的手卷格式,你可以通过递归来评估它;在伪代码:

def valof(node): 
    if node.index >= 0: 
    return whateverarray[node.index] 
    L = valof(node.lhs) 
    R = valof(node.rhs) 
    if node.opType == add: 
    return L + R 
    if node.opType == mul: 
    return L * R 
    # etc etc 

作为进一步的扭曲,因为你似乎想分数的结果,而输入值是整数,记住使用一小部分/有理数类型的计算 - 不知道C#自带一个,但最糟糕的情况是你可以在网上找到很多;-)。

+0

谢谢亚历克斯..这工作得很好 – mustafabar 2009-08-09 06:48:58

+0

内置表达式树不可序列化...我想通过它的WCF服务:)我不知道这是否可以acheivable – mustafabar 2009-08-09 06:49:53

3

需要递归算法,传递的值阵列(代码未经测试):

class Node{ 
    //... 
    double compute(int[] values){ 
    if(index >= 0) 
     return values[index]; // leaf node; value stored in array 
    switch(opType){ 
     case add: return lhs.compute(values)+rhs.compute(values); 
     case sub: return lhs.compute(values)-rhs.compute(values); 
     case div: return lhs.compute(values)*rhs.compute(values); 
     case mul: return lhs.compute(values)/rhs.compute(values); 
    } 
    throw new Exception("unsupported operation type"); 
    } 
} 

注意,这以双所有计算;如果你真的想要9/4,你需要使用一个合理的类型。