public
class EvalTree // see the BST words example{
public long i; private Node root = null; private string rpnExpr; private Dictionary<string, long> values = new Dictionary<string, long>(); // This is a special list where all the words are stored and a copy of it is here // The copy is named in this section values private class Node{
public Node(char d)//constuction func for private class Node taking one parameter{
data = d;
// a charecter as defined aboveleftPtr =
null;rightPtr =
null;singlePtr =
null;}
public char data; public Node leftPtr; public Node rightPtr; public Node singlePtr; //public Node x; //public Node y;}
public string RpnExpr { get { return rpnExpr; } }//returns the value of rpnExpr public void addValue(char c, long v)//function to add values to the dictionary{
values.Add(c.ToString(), v);
// v is long int and c is a charecter}
public void buildTree(string rpn) //function with one parameter that returns no value (void){
rpnExpr = rpn;
build(
ref root, ref rpn);//niether will be changed after the funtion...reference}
public long evalTree(){
return eval(root); // return eval that has the parameter root (value parmaeter)}
public long getValue(char c){
return values[c.ToString()]; // return values of the array holding charecters to string}
public void showTree(EvalTree t, TreeNode tn)//returns nothing but calls the show function{
show(t.root, tn);
//show called taking eval tree and tree node as parameters from above.}
public void reset(){
root =
null;//root is emptyrpnExpr =
"";//rpnExpr is an empty stringvalues.Clear();
//clears}
private void build(ref Node p, ref string rpn){
char c = rpn[rpn.Length - 1]; //array of rpn that will -1 from length each time func calledrpn = rpn.Substring(0, rpn.Length - 1);
if (p == null) p = new Node(c);// if node not there make a node if (!((c >= 'a') && (c <= 'z'))){
//if word more than a but less than zbuild(
ref p.rightPtr, ref rpn); //carry out this build functionbuild(
ref p.leftPtr, ref rpn);//none of the reference values change!!!}
}
private long eval(Node p) // the eval funtion with parmeter p.{
//return Factorial(p.data); if (!((p.data >= 'a') && (p.data <= 'z'))){
//if data bigger than a/less than z switch (p.data){
case '+': return eval(p.leftPtr) + eval(p.rightPtr);//pending the case case '-': return eval(p.leftPtr) - eval(p.rightPtr);//you carry out one of these case '*': return eval(p.leftPtr) * eval(p.rightPtr);// if its a charecter case '/': return eval(p.leftPtr) / eval(p.rightPtr); case '^': return (long)Math.Pow(Convert.ToDouble(eval(p.leftPtr)), Convert.ToDouble(eval(p.rightPtr))); case '!': return <--This is where I need the code}
else{
// else its a number, put in a string return values[p.data.ToString()];}
}
Thanks for any help,
Jim
I am not even close to a C# expert so please help.
Replies
Know the answer? Post it — somebody with the same question will find it here.