【问题标题】:Rpn calculator: How to free an element that was popped from the stack?Rpn 计算器:如何释放从堆栈中弹出的元素?
【发布时间】:2018-12-13 12:21:35
【问题描述】:

我将首先添加我的代码:

    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 函数中的内存。如何释放堆栈中的元素?

我知道描述这样的技术问题,所以如果缺少任何东西,我很乐意添加更多信息。

【问题讨论】:

    标签: c struct singly-linked-list


    【解决方案1】:

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

    你需要在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

    【讨论】:

    • 感谢您的快速回答。这似乎比我以前想象的要简单得多。我会尝试并提供反馈。 Float 已经给出,但你能解释一下为什么使用 double 会更好,这样当我有选择的时候我会知道该使用什么?
    • 请参阅this question 及其答案(以及其中的链接)以获得比您想知道的更多信息:) -- 基本上doublefloat 更精确,但代价是多一点内存,速度上的差异可以忽略不计。
    • 非常感谢您帮助我。
    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2015-08-13
    • 2016-06-29
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多