为什么我不能将从BST取出的节点推送到该堆栈中?

时间:2019-08-07 00:04:47

标签: c++ stack binary-search-tree

.h的结构如何:

template <typename T>
class Node {
    template <typename> friend class BST;
    public:
        Node(T p) : data(p), rlink(nullptr), llink(nullptr) {}
        ~Node() {}
    private:
        T data; // The holder of PACKET.
        Node *rlink, *llink;

};

template <typename T>
class BST {
public:
    BST();
    void insert(T &p);
    void inorderTraversal() const;
private:
    Node<T> * root; 
};

这是我将使用的可疑功能,出现问题的地方:

void inorderTraversal() const{
    stack <T> *iterStack;
    Node <T> *currentNode = root;
    iterStack->push(currentNode);
}

错误:

  

'void std :: stack >> :: push(const   Packet&)':无法将参数1从“节点*”转换为“ Packet &&”

如何解决这个问题,以便堆栈可以容纳我的节点?

请注意,Packet是由Node的私有成员T data接收的对象。

Packet.h(供参考):

class Packet {
public:
    Packet(int partId, string description, double price, int partCount) :
        partId(partId), description(description), price(price), partCount(partCount) {}
    int getPartId() const { return partId; }
    string getDescription() const { return description; }
    double getPrice() const { return price; }
    int getPartCount() const { return partCount; }
private:
    int partId;
    string description;
    double price;
    int partCount;
};

更新:

尝试

template <typename T>
void BST<T>::inorderTraversal() const{
    stack <Node<T> *> iterStack;
    Node <T> *currentNode = root;
    iterStack->push(currentNode);
}

出现错误:

  

'std :: stack *,std :: deque <_Ty,std :: allocator <_Ty >>>'不   成员'operator->'

具有超载      

'std :: stack *,std :: deque <_Ty,std :: allocator <_Ty >>> :: push':   左操作数具有“类”类型,请使用“。”

1 个答案:

答案 0 :(得分:1)

如有疑问,请替换您头脑中的模板参数,并考虑生成的代码。例如,如果出于您的目的,TPacket,则此:

std::stack<T> *iterStack;
Node <T> *currentNode = root;
iterStack->push(currentNode);

将与

同义
std::stack<Packet> *iterStack;
Node <Packet> *currentNode = root;
iterStack->push(currentNode);

很显然,此代码已被删减(仅因为显然是 yours ),所以人们可以理智地质疑iterStack是否首先必须是动态的。顺便说一句,不是)。

无论如何,显然std::stack<Packet>不能容纳Node<Packet>*个对象;但是std::stack< Node<Packet>* > 可以。即

std::stack< Node<T> > *iterStack;
Node <T> *currentNode = root;
iterStack->push(currentNode);

此外,很可能您的堆栈一开始不需要本身就是动态的。

std::stack< Node<T>* > stk;
Node <T> *currentNode = root;
stk.push(currentNode);