下面有一个堆栈ADT实现。在这个实现中,程序员使用了链表。
struct Node {
char *elem;
struct Node *next;
};
static struct Node *new_node(void *elem, int elem_size)
{
struct Node *n = malloc(sizeof(struct Node));
n->elem = malloc(elem_size);
memcpy(n->elem, elem, elem_size);
n->next = NULL;
retrun n;
}
struct Stack {
int elem_size;
int n_elems;
struct Node *top;
}
我得到了它,除了如下所示的代码块。
void stack_push(struct Stack *s, void *elem)
{
struct Node *n = new_node(elem, s->elem_size);
n->next = s->top;
s->top = n;
s->n_elems++;
}
我不明白
n->next = s->top;
s->top = n;
有谁愿意帮我理解这些陈述。我将不胜感激。
答案 0 :(得分:1)
推送操作会将新项目添加到堆栈顶部。在此实现中,堆栈的顶部是s->top
。堆栈中的第二项是s->top->next
,第三项是s->top->next->next
,依此类推。
我认为更容易想到
n->next = s->top;
s->top = n;
as
s->top = n;
n->next = s->top;
第一个语句是将新节点n
作为堆栈的顶部。但是堆栈的第二项是NULL
,而它应该是堆栈的旧顶部。第二个语句解决了这个问题,使堆栈的旧顶部成为堆栈的第二项。
答案 1 :(得分:1)
让我们试试我的Paint技巧:
在:
后:
NULL
表示节点指向空,即它是插入的最后一个节点。
请注意,next
指向下一个节点,而不是指向该节点的next
,我只是没有更好的方式在此处显示此内容。