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

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

提问人:notimportant 提问时间:4/28/2022 最后编辑:drescherjmnotimportant 更新时间:4/28/2022 访问量:208

问:

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;
}

我的复制构造函数有一个问题,当我调用它时,它反向显示链接列表,这是有道理的,因为我将其推到新链接列表的后面。假设我的函数 100% 工作并且我无法更改函数。我将如何反向添加它? 我在这里查看了几个解决方案,但没有很有帮助。

C++ singlely-linked-list 复制构造函数

评论

2赞 Remy Lebeau 4/28/2022
顺便说一句,代码很好(但你为什么要用 2 个指针进行迭代?但是我们看不到你的样子,所以据我们所知,它是以相反的顺序插入节点。请提供一个最小的可重复示例。为什么你使用像 and 这样的名称,而不是更常用的名字,比如 和 ?push()topdownheadnext
0赞 notimportant 4/28/2022
@drescherjm不,我只是有推送功能,它将数据转到新数据的开头
0赞 notimportant 4/28/2022
@drescherjm我知道我在想,如果我能迭代它,老化,把它推回去,它应该可以工作,但这没有用
0赞 fabian 4/28/2022
您是在实现堆栈还是链表?根据使用的标识符,您似乎将两者混合在一起;对于链表,我希望成员名称,而不是 和 ...headnextappendtopdownpush
0赞 notimportant 4/28/2022
@drescherjm这是一个整体堆栈,我改了名字,是的

答:

2赞 Ted Lyngmo 4/28/2022 #1

一种务实的方法可能是只复制数据两次:

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);
}

评论

0赞 notimportant 4/28/2022
那不起作用,我得到的输出与Node *temp = rhs.top; while (temp) { push(temp->letter); temp=temp->down;}
0赞 Ted Lyngmo 4/28/2022
@notimportant我不知道你做了什么,但这对我来说很好。无论如何,弗拉德的解决方案更优雅(也更便宜),所以我会选择那个。
3赞 Vlad from Moscow 4/28/2022 #2

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

    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;
    } 
}

我希望类 Node 的构造函数将创建的节点的数据成员设置为 .nullptr

评论

0赞 Ted Lyngmo 4/28/2022
很好!不过,我认为一些解释会有所帮助。指针魔术 :-)