Example #1
0
Err_t PRNTreeProcess(CBinaryTree<rpn_t>** RPNTree,rpn_t* expression)
{
    CStack<nodeType<rpn_t>* > box; /*Using a stack box to process the expression*/
    nodeType<rpn_t>* newNode;
    nodeType<rpn_t>* left,*right;
    rpn_t* idx=expression;
    if((RPNTree==NULL)||(expression==NULL))
        return INVALIDE_PARAMET;

    while(idx->type!=TYPE_NULL)
    {

        /*Process number*/
        if(idx->type==TYPE_NUMBER)
        {
            newNode=new nodeType<rpn_t>;
            newNode->elem=*idx;
            newNode->lLink=NULL;
            newNode->rLink=NULL;
            box.PushNoCopy(&newNode);
            idx++;
            continue;
        }

        /*
        *   If it is a operators then pop out 2 element from the box,build a tree;
        */

        if(idx->type==TYPE_OP)
        {
            newNode=new nodeType<rpn_t>;
            newNode->elem=*idx;
            newNode->lLink=NULL;
            newNode->rLink=NULL;
            box.PopNoCopy(&right);
            box.PopNoCopy(&left);

            (*RPNTree)->SetRoot(newNode);
            (*RPNTree)->SetLeftChild(left);
            (*RPNTree)->SetRightChild(right);

            box.PushNoCopy(&newNode);
            idx++;
        }
    }

    return RETURN_SUCCESS;

}