C 堆栈ADT实现中的不可理解表达式
下面是一个堆栈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
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;