为什么s1->top
是显示功能的开头?
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
只显示(打印)堆栈。它是从顶部开始显示它的实现者的选择。堆栈通常从顶部LIFO开始工作。
请注意,如果s1
为空,则Nodeptr ptr = s1 - > top;
的访问权限无效,并可能导致分段错误。
答案 1 :(得分:0)
因为display
函数将显示堆栈中的所有元素,并且它必须从顶部开始,因为这是唯一可用的元素。
ptr
是一个循环变量。它从堆栈的顶部开始,在每次迭代时,它被移动到下一个元素,直到它到达堆栈的底部,即具有NULL下一个指针的节点。
修改
为什么从顶部开始而不是从底部开始?主要是因为它更容易。您可以访问堆栈顶部,每个节点都可以访问它下面的节点,但不能访问它上面的节点。
如果你想从下往上打印,那就更难了。你如何从底部项目到上面的项目?除非你记得它的前身,否则你无法做到。
从底部开始的最简单方法是首先反转堆栈,即从顶部迭代它并创建一个新的堆栈,但它仍然比仅仅说"我们和#39;将从顶部打印"。