c - Rpn 计算器:如何释放从堆栈中弹出的元素?
问题描述
我将首先添加我的代码:
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 函数中的内存。如何释放堆栈中的元素?
我知道描述这样的技术问题,所以如果缺少任何东西,我很乐意添加更多信息。
解决方案
我的问题是我不确定如何释放在 push 函数中分配的 pop 函数中的内存。如何释放堆栈中的元素?
您需要在ing 元素next
之前保存指针:free()
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
.
推荐阅读
- sql - 如何在使用多个大表时优化 Hive 中的连接性能
- python - 如何使用 boto3 获取所有 AWS AMI 的列表?
- sql - 请求其他表中至少有 2 条记录
- java - 创建文本文件并添加到 zip 文件并在本地服务器中下载 spring boot
- php - 如何在 PHP 中将 ByteArray 字符串转换为 NEO 地址?
- facebook - Facebook 私人回复回复未提供 user_id
- azure - 如何创建与 adla 的链接服务
- c++ - 我可以根据其 operator() 的签名专门化可变参数模板参数吗
- java - 集成总线添加外部 jar 异常
- google-cloud-platform - 如何将堆栈驱动程序日志导出到文件以进行本地处理?