-4

我有这个用于将对象推入堆栈的代码,我无法理解每一行的作用,如果有人可以解释为什么前一个节点(newNode.next)必须等于顶部,以及为什么然后让顶部等于新节点。

void push(AnyClass newbObj)
{
  Node newNode = Node(newObj);
  newNode.next = top;
  top = newNode;
}
4

3 回答 3

2

这看起来像一个链表实现。在链表中,每个项目都有一个指向列表中下一个项目的指针(引用)。

该变量top似乎是对列表开头节点的引用,因此表示堆栈的顶部。

让我们假设列表开始看起来像这样:

item 1 -> item 2 -> etc...
^----top

第一行只是将参数转换为正确的类型,我们可以改为定义push()取 aNode并完全删除这一行。

由于我们想在前面插入新节点,首先我们需要确保它指向列表的其余部分,使用:

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

我们完成了。

于 2013-01-26T22:21:18.747 回答
1

让我分步骤为您解释:

  1. newNode 是使用代码创建的新节点Node newNode = Node(newObj);。您希望将其放在堆栈顶部(即推送)
  2. 现在在堆栈顶部,您还有另一个名为 top 的节点。
  3. 您想将当前顶部节点向下推一级
  4. 您在以下代码中将新节点链接到当前顶部节点。

    newNode.next = top

  5. 此后,您在以下代码中将新节点设为栈顶:

    top = newNode

编辑

有些人强调第 4 行。

newNode.next = top意味着newNode有一个名为的变量 next

这将存储memory address先前的 Top 节点。因此,如果我们想通过当前 Top 节点 ( newNode) 访问前一个顶级节点,我们可以通过以下方式轻松完成:

Node prevTopNode = (Node)top.next

于 2013-01-26T22:14:59.673 回答
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
}
于 2013-01-26T22:10:28.420 回答