有人可以帮我理解以下功能中发生的事情吗?具体使用s1-> top?什么是s1->顶部的功能push& pop& amp;显示?因为如果在函数push中,只要按下数字,s1-> top就会向右移动?那么为什么在显示功能中,它说s1-> top在遍历中是第一个,而在push s1-> top是n右边,而在打印值时,我们需要先在左边然后遍历..why?
typedef struct node* Nodeptr;
typedef char dataitem;
typedef struct node{
dataitem data;
Nodeptr next;
}Node;
typedef struct{
int count;
Nodeptr top;
}Stack_Head;
typedef Stack_Head* Stack;
Stack createStack() {
Stack s1;
s1 = (Stack) malloc(sizeof(Stack_Head));
s1 - > count = 0;
s1 - > top = NULL;
return s1;
}
Nodeptr createNode(dataitem item) {
Nodeptr temp;
temp = (Nodeptr) malloc(sizeof(Node));
temp - > data = item;
temp - > next = NULL;
return temp;
}
void push(Stack s1, dataitem item) {
Nodeptr temp = createNode(item);
temp - > next = s1 - > top;
s1 - > top = temp;
s1 - > count++;
}
void display(Stack s1) {
Nodeptr ptr = s1 - > top;
while (ptr != NULL) {
printf("%d", ptr - > data);
ptr = ptr - > next;
}
printf("\n");
}
void pop(Stack s1) {
Nodeptr temp;
if (isEmpty(s1))
printf("List is Empty");
else {
temp = s1 - > top;
s1 - > top = temp - > next;
temp - > next = NULL;
free(temp);
s1 - > count;
}
int isEmpty(Stack s1) {
return s1 - > top == NULL;
}
答案 0 :(得分:0)
首先,让我们修复一个错误 - 在函数display()
中,我假设该行:
while (ptr1 = NULL) {
应该是:
while (ptr != NULL) {
在你的问题中,你指的是"左"和"对",但作为变量" top"暗示,更容易看到垂直堆栈。
例如,想象一堆餐盘。新的盘子总是“推”到顶部,并且根据需要它们也会被弹出#34;从顶部。
正如您所看到的,这种堆栈称为后进先出(或LIFO)堆栈,这正是您的代码正在实现的。
s1->top
变量是指向堆栈顶部的指针 - 即。添加的最后一个节点,也是第一个被删除的节点。每个节点还有一个指向next
节点的指针""它。 NULL用于表示s1->top
和node->next
指针不再有节点"
所以在push()
中,为了保持一致性必须要做两件事:
->next
指针设置为当前
"顶部"堆栈(所以现有的顶部是""新的到来),
和请注意,此处的操作顺序非常重要 - 如果(2)在(1)之前执行,那么您最终可能会遇到新到达" - > next"指针指向自己!
pop()
基本上执行相反的操作,而display()
只是运行堆栈中的所有元素(注意display()
不会改变s1->top
的值)
答案 1 :(得分:0)
我不知道你的问题是什么,
在你的代码中修复了一些missclicks之后
while(ptr1 = NULL)
到while(ptr != NULL)
,
和printf("%f")
- "%c"
代码
int main() {
Stack a = createStack();
push(a, 'a');
push(a, 'b');
push(a, 'c');
push(a, 'd');
push(a, 'e');
display(a);
return 0;
}
我的输出正确
//edcba