如何从堆栈中弹出不同类型的结构
我有一个包含两种类型结构的堆栈。 结构螺柱和结构教授当我想要推动某些东西时,我为两个结构创建了两个推送function。 虽然我希望它有一个function,但它可以,我可以忍受它。
现在去Pop。 如果我想从Stack中弹出一个学生,我是否必须专门为学生制作一个Popfunction? 教授一样吗?
如果我不知道它是什么类型,我该如何存储该项目? 元素必须是什么类型,才能将项目存储在那里?
结构如下:
struct MyStack { int head; void **stack; int size; }; typedef struct MyStack STACK; struct stud { char flag; char fname[50]; int semester; }; struct prof { char flag; char fname[50]; char course[30]; };
现在创建Popfunction。 我在函数中传递了什么类型的项目?
int Pop(STACK *stack,int *head,??? *elem) { if(stack->headstack[*head]; *head--; return 1; }
您必须在推送时对类型信息进行编码,最简单的可能是键入标记:
#define STUD 0 #define PROF 1 struct stack_entry { int type; void *item; }; struct MyStack { int head; struct stack_entry *stack; int size; };
然后更改推送function以在推送时附加正确的标签。 然后,在pop中,最简单的可能就是返回一个stack_entry结构,然后让调用函数找出它。 那时你可能想要一个比“stack_entry”更流畅的名字。 另外,使用联合会稍微好一些:
struct stack_entry { int type; union { struct stud *stud; struct prof *prof; } item; }
因为编译器可以帮助你一点点,但当然你仍然需要或多或少地像使用void *一样小心。
编辑:初始化……
您不必用任何东西标记缓冲区的结尾,因为结构中有一个大小变量。 但是,如果你想这样做,我会有自己的类型
#define END_OF_BUFFER 1 #define STUD 2 #define PROF 3
然后对于init你可以这样做:
stack->size = size; stack->stack = calloc(sizeof(*stack->stack), size + 1); stack->stack[size].type = END_OF_BUFFER; stack->head=-1;
虽然我倾向于使用“head”来指向指向下一个要写入的位置的指针,但我不确定它是多么标准。 但缓冲区是一个strack_entries数组,而不是void *。