使用链表堆栈实现创建一个反转堆栈的复制构造函数

Create a copy constructor that reverses a stack using a linked list stack implementation

linkList::linkList(linkList const& rhs){
    Node *temp = rhs.top;
    Node *temp_stack = rhs.top;
    while(temp){
        char value = temp->letter;
//        push(value);
        push(temp_stack->letter);
        temp = temp_stack->down;
        temp_stack = temp_stack->down;
//        temp = temp->down;
    }
}

void linkList::push(char c) {
    Node* new_top = new Node(c);
    new_top->down = top;
    top = new_top;
}

我的复制构造函数有一个问题,当我调用它时,它会反向显示 link-列表,这是有道理的,因为我将它推到新的 [=13= 的后面]-列表。假设我的功能 100% 正常工作并且我无法更改该功能。我将如何反向添加它? 我在这里查看了几个解决方案,但没有多大帮助。

实用的方法可能是只复制数据两次:

linkList(linkList const& rhs) {
    linkList tmp;
    // first copy to `tmp`, which will have them in reverse:
    for(Node* curr = rhs.top; curr; curr = curr->down) 
        tmp.push(curr->letter);

    // then populate *this from `tmp` which will then have them
    // in the original order:
    for(Node* curr = tmp.top; curr; curr = curr->down)
        push(curr->letter);
}

对于函数中这两个指针的初始声明

    Node *temp = rhs.top;
    Node *temp_stack = rhs.top;

没有多大意义。他们互相复制。用一个指针遍历链表rhs.

就够了

如果要创建传递列表的副本,则函数 push 不适合。

您可以通过以下方式定义复制构造函数。

linkList::linkList( linkList const& rhs ) : top( nullptr )
{
    Node **current = ⊤

    for ( Node *temp = rhs.top; temp != nullptr; temp = temp->down )
    {
        *current = new Node( temp->letter );
        current = &( *current )->down;
    } 
}

希望class节点的构造函数将创建节点的数据成员down设置为nullptr