我有这个代码用于将对象推入堆栈,我无法理解每一行的作用,如果有人可以解释为什么前一个节点(newNode.next)必须等于top,以及为什么然后制作top等于newNode。
void push(AnyClass newbObj)
{
Node newNode = Node(newObj);
newNode.next = top;
top = newNode;
}
答案 0 :(得分:2)
这看起来像一个链表实现。在链表中,每个项目都有一个指针(引用)到列表中的下一个。
变量top
似乎是对列表开头节点的引用,因此代表堆栈的顶部。
我们假设列表开始如下所示:
item 1 -> item 2 -> etc...
^----top
第一行只是将参数转换为正确的类型,我们可以改为定义push()
代替Node
并完全删除此行。
由于我们想在前面插入新节点,首先我们需要确保它指向列表的其余部分:
newNode.next = top; //Point newNode's 'next' field to the current top of the list
这给了我们一些看起来像这样的东西
newNode -> item 1 -> item 2 -> etc...
^----top
但top
仍指向旧项目,因此我们现在更新:
top = newNode; //Re-assign top to point to the new head of the list
现在列表如下:
newNode -> item 1 -> item 2 -> etc...
^----top
我们已经完成了。
答案 1 :(得分:1)
让我分一步解释你:
- newNode是使用代码
Node newNode = Node(newObj);
创建的新节点。并且您希望将其置于堆栈顶部(即推送)- 现在在堆栈顶部,您有另一个名为top的节点。
- 您想将当前的顶级节点推向一级
您可以通过以下代码将新节点链接到当前的顶级节点。
newNode.next = top
- 醇>
然后在以下代码中将新节点作为堆栈顶部:
top = newNode
修改强>
有些人强调第4行。
newNode.next = top
表示newNode
有一个名为的变量next
将存储前一个Top节点的
memory address
。 因此,如果我们想要通过当前Top节点访问前一个顶级节点 (newNode
)我们可以通过以下方式轻松完成:
Node prevTopNode = (Node)top.next
答案 2 :(得分:0)
我添加了一些评论,希望有所帮助。
void push(AnyClass newbObj)
{
Node newNode = Node(newObj); //create a new node of the stack containing the data (newbObj)
newNode.next = top; //the new node has thw prevois top of the stack the successor
top = newNode; //the new node is now the top of the tsack
}