You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指针与数组的栈操作:如何Push结构体数据?

解决栈Push操作的问题及结构体数据存储方案

原代码的核心问题

原struct stk的设计存在逻辑混淆:它既是栈本身的结构,又被作为栈中存储的元素类型(elems是struct stk*数组),这显然不是用来存储业务数据的合理设计。你需要把「栈结构」和「要存储的数据结构」分开。

改造方案:分离栈与数据结构体

1. 定义自定义数据结构体

先定义你要存储的数据结构,比如包含ID、名称的业务数据:

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

#define MAX 100 // 定义栈的最大容量,原代码缺失该定义

// 自定义数据结构体,按需添加字段
typedef struct {
    int id;
    char name[20];
} Data;

2. 调整栈结构体

修改栈的elems类型,改为存储Data*指针:

// 栈结构体:负责管理数据的存储与弹出
typedef struct stk {
    Data* elems[MAX];
    int top;
} stack, *stackptr;

3. 适配Push/Pop函数

将操作函数的参数类型改为Data*,匹配存储的数据类型:

void Init(stack* s) {
    s->top = 0;
}

int IsEmpty(stack s) {
    return (s.top == 0);
}

void Push(Data* item, stack* s) {
    if (s->top == MAX) {
        printf("Stack voll!\n");
        return;
    }
    s->elems[s->top] = item;
    s->top++;
}

Data* Pop(stack* s) {
    if (IsEmpty(*s)) return NULL;
    s->top--;
    return s->elems[s->top];
}

4. main函数中实现完整操作

在主函数中创建数据节点、压栈、出栈,并做好内存管理:

int main() {
    stack* ptr = (stackptr)malloc(sizeof(stack));
    Init(ptr);
    printf("%d\n", ptr->top); // 输出0,初始化正常

    // 创建第一个数据节点并压栈
    Data* data1 = (Data*)malloc(sizeof(Data));
    data1->id = 1;
    strcpy(data1->name, "Malek");
    Push(data1, ptr);

    // 创建第二个数据节点并压栈
    Data* data2 = (Data*)malloc(sizeof(Data));
    data2->id = 2;
    strcpy(data2->name, "Alice");
    Push(data2, ptr);

    // 弹出并打印数据
    Data* popped = Pop(ptr);
    if (popped) {
        printf("弹出数据:ID=%d,Name=%s\n", popped->id, popped->name);
        free(popped); // 释放数据节点内存
    }

    popped = Pop(ptr);
    if (popped) {
        printf("弹出数据:ID=%d,Name=%s\n", popped->id, popped->name);
        free(popped);
    }

    free(ptr); // 释放栈的内存
    return 0;
}

关键说明

  • 栈的核心作用是管理数据的入栈/出栈顺序,本身不应该和业务数据绑定,分离结构是合理设计的基础。
  • 所有malloc分配的内存,在使用完毕后必须用free释放,避免内存泄漏。
  • 如果必须复用原代码的Push参数类型(struct stk*),可以将Data嵌入到struct stk中,但这会让栈结构耦合业务数据,不推荐。

内容的提问来源于stack exchange,提问作者Malek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:35:16