提问人:notimportant 提问时间:4/28/2022 最后编辑:drescherjmnotimportant 更新时间:4/28/2022 访问量:208
创建一个复制构造函数,该构造函数使用链表堆栈实现反转堆栈
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;
}
我的复制构造函数有一个问题,当我调用它时,它反向显示链接列表,这是有道理的,因为我将其推到新链接列表的后面。假设我的函数 100% 工作并且我无法更改函数。我将如何反向添加它? 我在这里查看了几个解决方案,但没有很有帮助。
答:
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
很好!不过,我认为一些解释会有所帮助。指针魔术 :-)
评论
push()
top
down
head
next
head
next
append
top
down
push