gpt4 book ai didi

c - 用c写一个push和pop

转载 作者:行者123 更新时间:2023-11-30 17:43:55 25 4
gpt4 key购买 nike

原始问题:我正在尝试用 C 语言为一个项目创建这个计算器。我让数学函数正常工作,但我不知道如何处理插入和弹出。有人可以帮助我开始吗?我知道java中的push和pop应该做什么,但我不确定如何在不使用节点或数组的情况下使用它们。

我的包含和堆栈结构:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "stack.h"
#include "debug.h"

#define DEFAULT_CAPACITY 16

struct stack {
size_t capacity;
size_t size;
stack_item *data;
};

我尝试推送和弹出:

已更新

    void push_stack (stack *this, stack_item item) {
if (full_stack (this)) realloc_stack (this);
this->data[this->size++]=item;
}

stack_item pop_stack (stack *this) {
assert (! empty_stack (this));
if(this->data == NULL){
fprintf(stderr, "fail");}
else{
stack_item tempPop = this->data[this->size--];
return tempPop;}
}

更新的问题:这就是我现在正在为我的推送/弹出方法所做的事情。我没有收到任何警告,也没有错误,但是当我运行它时,它会在弹出后出现段错误。

我的新问题是,我在这段代码中所做的事情是否导致了我的段错误?

最佳答案

使用链接列表。

struct stack_element {
struct stack_element* next; // reserved for stack control
int data0; // whatever
int data1;
int data2;
};

void push_stack(struct stack_element** stack, struct stack_element* element)
{
element->next = *stack;
*stack = element;
}

struct stack_element* pop_stack(struct stack_element** stack)
{
struct stack_element* element = *stack;
if (element)
*stack = element->next;
return element;
}

struct stack_element* stack = NULL; // your stack. its empty

创建新的堆栈元素并添加到堆栈:

struct stack_element* element = malloc(sizeof(struct stack_element)); // created new element
element->data0 = 123;
element->data1 = 456;
element->data2 = 789;
push_stack(&stack, element); // stored in stack

从堆栈中获取元素:

struct stack_element* element = pop_stack(&stack);
if (element == NULL)
printf("Stack was empty, no elements to fetch.");

PS:同一个元素永远不能多次入栈。

您还可以将堆栈控制与数据分开,在这种情况下,您将能够多次存储相同的元素:

struct stack_control {
struct stack_control* next;
void* data;
};

void push_stack(struct stack_control** stack, void* data)
{
struct stack_control* temp = malloc(sizeof(struct stack_control));
temp->data = data;
temp->next = *stack;
*stack = temp;
}

void* pop_stack(struct stack_control** stack)
{
void* data = NULL;
struct stack_control* temp = *stack;
if (temp)
{
data = temp->data;
*stack = temp->next;
free(temp);
}
return data;
}

struct stack_control* stack = NULL; // empty stack

此代码可用于堆栈任何类型的指针,因为 void* 是通用的。

关于c - 用c写一个push和pop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157199/

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