基于指针与数组的栈操作:如何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
相关产品推荐
相关产品推荐

