c - Rpn 计算器 : How to free an element that was popped from the stack?

标签 c struct singly-linked-list

我将首先添加我的代码:

    typedef struct _stack stack;
    typedef struct _stack_element stack_element;

    struct _stack {
        stack_element* top;
    };

    struct _stack_element {
        stack_element* next;
        float value;
    };

    void stack_push(stack* astack, float value)
    {


        struct _stack_element *elem=calloc(1,sizeof(stack_element));

           elem->value=value;


          if(astack->top==NULL){
            astack->top=elem;
          }
          else{
            elem->next=astack->top;
            astack->top=elem;
          }

    }


    float stack_pop(stack* astack)
    {
    float Number;
      if(astack==NULL){
        Number=NAN;
        return Number;
      }
      else{

        Number=astack->top->value;
        astack->top=astack->top->next;
    }
      return Number;
    }

     void process(stack* astack, char* token)
    {
        /* HIER implementieren */
      //  printf("\n<Logik fehlt!>\n");

        if(is_number(token)==1){
          float number=atof(token);
          stack_push(astack, number);
        }

        if(is_add(token)==1){
          float Number1=stack_pop(astack);
          float Number2=stack_pop(astack);
          float result=Number1+Number2;
          stack_push(astack, result);

        }
        if(is_sub(token)==1){
          float Number1=stack_pop(astack);
          float Number2=stack_pop(astack);
          float result=Number2-Number1;
          stack_push(astack, result);

        }
        if(is_mult(token)==1){
          float Number1=stack_pop(astack);
          float Number2=stack_pop(astack);
          float result=Number1*Number2;
          stack_push(astack, result);

        }
        return;
    }

    void print_stack(stack *astack) {
        int counter = 0;
        printf("\n |xxxxx|xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxx|xxxxxxxxx|\n");
        printf(" | Nr. | Adresse           | Next              | Wert    |\n");
        printf(" |-----|-------------------|-------------------|---------|\n");
        for (stack_element* elem=astack->top; elem != NULL; elem = elem->next) {
            printf(" | %3d | %17p | %17p | %7.3f |\n", counter, elem, elem->next, elem->value);
            counter++;
        }
        printf(" |xxxxx|xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxx|xxxxxxxxx|\n");
    }

    stack* stack_erstellen() {
      struct _stack* Stack =(struct _stack*)calloc(1, sizeof(struct _stack));

      Stack->top=NULL;

    return Stack;

    }

    int main(int argc, char** args)
    {
        stack* astack = stack_erstellen();
        char zeile[MAX_STR];
        char* token;

        intro();
        while (taschenrechner_input(zeile) == 0) {
            // Erstes Token einlesen
            token = strtok(zeile, " ");

            while (token != NULL) {
                printf("Token: %s\n", token);
                // Stackoperationen durchführen    return;

                process(astack, token);
                // Nächstes Token einlesen
                token = strtok(NULL, " ");
                print_stack(astack);
            }

            printf("\nExtrahiere Resultat\n");
            float result = stack_pop(astack);
            print_stack(astack);

            if (astack->top != NULL) {
                while (astack->top != NULL) {
                    stack_pop(astack);   //Räume Stack auf
                }
                printf("\nDoes not Compute: Stack nicht leer!\n");
            } else if (result != result) {
                printf("\nDoes not Compute: Berechnung fehlgeschlagen!\n");
            } else {
                printf("\nDein Ergebnis:\t%7.3f\n\n", result);
            }
        }
        free(astack);
    }

我是编码新手。上面的代码来自大学的作业。我必须创建的功能是:

  • void stack_push(stack* astack, float value)
  • void stack_pop(stack* astack)
  • void process (stack* astack, char* token)
  • stack* stack_erstellen()(翻译为“create_stack”)

还有另一个 c 文件与这个文件一起编译,但我不允许更改任何内容,所以我没有将它添加到这篇文章中。

计算器似乎工作正常,print_stack() 函数还表明 push 和 pop 函数按预期工作。

我的问题是我不确定如何释放 push 函数中分配的 pop 函数中的内存。如何释放堆栈中的元素?

我知道如何描述这样的技术问题,所以如果有任何不足,我会很乐意添加更多信息。

最佳答案

My problem is that I am not sure how to free the memory in the pop function that allocated in the push function. How do I free the elements of my stack?

您需要在 free() 元素之前保存 next 指针:

    float stack_pop(struct _stack *astack) {
        float Number;
        if (astack == NULL) {
            Number = NAN;
            // return Number; // no need for return here
        } else {
            Number = astack->top->value;
            struct _stack_element *tmp = astack->top->next; // save
            free(astack->top);                              // free
            astack->top = tmp;                              // restore
        }
        return Number;
    }

我冒昧地根据自己的喜好格式化了您的代码:)

此外,请考虑使用 double 而不是 float

关于c - Rpn 计算器 : How to free an element that was popped from the stack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53761753/

相关文章:

c - 总价的 if-else 代码无法编译

struct - 从扩展中返回 CGPoint

java - 添加到链表的尾部

c - 嵌入式 C 中的动态内存分配

c - ebpf - 部分名称

c - 在指向数组的指针中使用类型转换

c - 从单链表中删除节点

c - 数组的内联初始化

c - 错误: expected expression before 'book'

c++ - 使用模板链表类复制构造函数错误