运动&在以下函数中,s1-> top的起点,push,display&弹出

时间:2017-04-07 04:00:44

标签: c stack

有人可以帮我理解以下功能中发生的事情吗?具体使用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;
    } 

2 个答案:

答案 0 :(得分:0)

首先,让我们修复一个错误 - 在函数display()中,我假设该行:

while (ptr1 = NULL) {

应该是:

while (ptr != NULL) {

在你的问题中,你指的是"左"和"对",但作为变量" top"暗示,更容易看到垂直堆栈。

例如,想象一堆餐盘。新的盘子总是“推”到顶部,并且根据需要它们也会被弹出#34;从顶部。

正如您所看到的,这种堆栈称为后进先出(或LIFO)堆栈,这正是您的代码正在实现的。

s1->top变量是指向堆栈顶部的指针 - 即。添加的最后一个节点,也是第一个被删除的节点。每个节点还有一个指向next节点的指针""它。 NULL用于表示s1->topnode->next指针不再有节点"

所以在push()中,为了保持一致性必须要做两件事:

  1. 必须将新到达的->next指针设置为当前 "顶部"堆栈(所以现有的顶部是""新的到来), 和
  2. 必须将新到货设置为新的" top"。
  3. 请注意,此处的操作顺序非常重要 - 如果(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