gpt4 book ai didi

c - Pop() 方法总是给出堆栈中的第一个元素而不删除它

转载 作者:行者123 更新时间:2023-11-30 15:53:54 24 4
gpt4 key购买 nike

我的程序应该读取后缀表达式并使用树实现将其转换为中缀和前缀。pop() 方法总是给出第一个元素而不删除它,我不明白为什么。任何帮助将不胜感激。

        //tree structur
typedef struct asa {
enum { number_exp,sous_exp_op } type;
union {
int child;
struct {
struct asa* left;
struct asa* right;
char oper; } tree;
} op;
} asa;

//stack
typedef struct stack {
int size;

struct {
asa * element;
struct stack* link;
}e;

} stack;

struct stack *top;

(...)

asa * pop(){
asa* e ;
stack * temp;
if(top->size == 0 ){
printf("ERR0R : empty stack\n");
exit (EXIT_FAILURE);
}
else if (top->size >= 1){
temp = top->e.link;
e= top->e.element;

top = temp;
}
return e;
}

void push(asa* node ){
if(top->size == 0 ){
top->e.element = node;
top->e.link = NULL;
top->size++;
}
else if (top->size > 0){
pile * next = (pile*) malloc(sizeof(top));
next = top;
top->e.element = node;
top->e.link = next;
top->size++;
}
}

日志快照:

enter image description here

最佳答案

您面临的直接问题是,一旦您在 top->size > 0 时分配它,您就会丢弃 next 并且您正在为指针分配大小,而不是比整个结构。要修复它们,请将函数末尾的 next = top 替换为 top = next 并修复 sizeof 调用:

    else if (top->size > 0){
pile * next = (pile*) malloc(sizeof(*top));
next->e.element = node;
next->e.link = top;
next->size = top->size + 1;
top = next;
}

此外,这种堆栈实现感觉过于复杂且容易出错。如果需要堆栈大小,则应独立于链表的节点维护大小,而不是在每个单独的节点中维护大小。标准链表习惯用法是将空列表(堆栈)表示为 NULL,因此入栈或弹出都不需要任何额外的代码来检查空堆栈:

typedef struct stack {
asa *element;
struct stack *next;
} stack;

void push(stack **head, asa *elem)
{
stack *new_head = malloc(sizeof(stack));
new_head->next = head;
new_head->elem = elem;
*head = new_head;
}

asa *pop(stack **head)
{
stack *old_head = *head;
asa *top_elem = old_head->elem;
*head = old_head->next;
free(old_head);
return top_elem;
}

关于c - Pop() 方法总是给出堆栈中的第一个元素而不删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13437423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com