Stack ADT实现中难以理解的表达
Incomprehensible expression in Stack ADT implementation
下面有一个堆栈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;
有没有人愿意帮助我理解这个语句。我会感激的。
推送操作将一个新项目添加到堆栈的顶部。在这个实现中,栈顶是s->top
。堆栈中的第二项是 s->top->next
,第三项是 s->top->next->next
,依此类推。
我觉得比较容易想到
n->next = s->top;
s->top = n;
作为
s->top = n;
n->next = s->top;
第一个语句是使新节点n
成为堆栈的顶部。但是堆栈的第二项是 NULL
而它应该是堆栈的旧顶部。第二条语句解决了这个问题,使旧的堆栈顶部成为堆栈的第二项。
让我们试试我的绘画技巧z:
之前:
之后:
NULL
表示该节点不指向任何内容,即它是最后插入的节点。
请注意,next
指向下一个 节点 ,而不是那个节点的 next
,我只是没有更好的方式在这里显示它。
下面有一个堆栈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;
有没有人愿意帮助我理解这个语句。我会感激的。
推送操作将一个新项目添加到堆栈的顶部。在这个实现中,栈顶是s->top
。堆栈中的第二项是 s->top->next
,第三项是 s->top->next->next
,依此类推。
我觉得比较容易想到
n->next = s->top;
s->top = n;
作为
s->top = n;
n->next = s->top;
第一个语句是使新节点n
成为堆栈的顶部。但是堆栈的第二项是 NULL
而它应该是堆栈的旧顶部。第二条语句解决了这个问题,使旧的堆栈顶部成为堆栈的第二项。
让我们试试我的绘画技巧z:
之前:
之后:
NULL
表示该节点不指向任何内容,即它是最后插入的节点。
请注意,next
指向下一个 节点 ,而不是那个节点的 next
,我只是没有更好的方式在这里显示它。