Stack ADT实现中难以理解的表达式

时间:2015-05-20 18:22:19

标签: c stack

下面有一个堆栈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;

有谁愿意帮我理解这些陈述。我将不胜感激。

2 个答案:

答案 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技巧:

在:

enter image description here

后:

enter image description here


NULL表示节点指向空,即它是插入的最后一个节点。 请注意,next指向下一个节点,而不是指向该节点的next,我只是没有更好的方式在此处显示此内容。