In main, you declare a list of strings called prefix queue_type prefix; for(string s; s!="#"; ) { cin >> s; if(s != "#") prefix.inserttail(s); } bexprtree x; x.buildtree(prefix); cout << x.evaluate(); // make this more user friendly buildtree (note the name change): newprefix = prefix; // not necessary if prefix is passed by value // instead of const reference / if you understand what this means, make the change builder (root, newprefix); builder: if (prefix.size() > 0) { prefix.retrieve (item, 1); prefix.delete (1); root = new bnode; root->item = item; if item is an operator // note this is not c++ code { build (root->left->root, prefix); build (root->right->root, prefix); } } Evaluate: return evaluator(root); evaluator: if (root != 0) { item = root->item; if item is an operator { leftvalue = evaluator(root -> left->root); rightvalue = evaluator(root -> right->root); /* The following comment should be translated to c++ code depending on the value of the item '+': return leftvalue + rightvalue '-': return leftvalue - rightvalue '*': return leftvalue * rightvalue '/': return leftvalue / rightvalue */ } else { return double(item); } }