Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 堆栈ADT实现中的不可理解表达式_C_Stack - Fatal编程技术网

C 堆栈ADT实现中的不可理解表达式

C 堆栈ADT实现中的不可理解表达式,c,stack,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->ele

下面是一个堆栈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;
作为


第一条语句是使新节点
n
位于堆栈顶部。但是堆栈的第二项是
NULL
,而它应该是堆栈的旧顶部。第二条语句修复了这个问题,使堆栈的旧顶部成为堆栈的第二项

让我们试试我的绘画技巧z:

之前:

之后:


NULL
表示节点未指向任何内容,即它是最后插入的节点。
请注意,
next
指向下一个节点,而不是该节点的
next
,我只是没有更好的方法在这里显示它;然后将
s->top
设置为指向新插入的元素。*headPtr->A->B->C->NULL,对于堆栈ADT,由于后进先出,应在A之前添加一个新节点?给定语句:“retrun n;”很明显,这不是代码的真实副本。建议执行简单的复制/粘贴“问题”代码只是在链表的开头插入新节点。顺便说一句:从malloc返回的值应该总是被检查(!=NULL),以确保操作成功。添加新节点的过程是这样的:A->D->B->NULL如果我想将“E”添加到堆栈中,它将变成A->D->B->E->NULL。我说得对吗@如果你按下
E
,它将变成
E->A->D->B->NULL
。你需要仔细阅读这本书。您所描述的是您将在一个场景中看到的行为。
s->top = n;
n->next = s->top;