typedef struct{
void *elems; //栈底指针int loglen; //已经使用的长度int alloclen; //已经申请的长度int elemSize; //单个元素的长度
}stack;
void StackNew(stack *s, int elemSize)
{
assert(elemSize > 0);s->elemSize = elemSize;s->loglen = 0;s->alloclen = 4;s->elems = malloc(4 *elemSize);assert(s->elems != NULL);
}
void StackPush(stack *s, void *elemAdd)
{
//栈满则采用加倍策略增长
if (s->loglen == s->alloclen){StackGrow(s);}
void *target = (char *)(s->elems) + loglen * (s->elemSize);memcpy(target, elemAdd, s->elemSize);s->loglen++;
}
static void StackGrow(stack *s)
{
s->alloclen *= 2;
s->elems = realloc(s->elems, (s->alloclen) * (s->elemSize));
}
void StackPop(stack *s, void *elempop)
{
//获取栈顶元素指针
void *source = (char*)(s->elems) + (s->loglen - 1 ) *(s->elemSize);memcpy(elempop, source, s->elemSize);s->loglen--;
}
简单测试
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
int id;
string name;
Student(){}
Student(int i,char* n)
{
id = i;
name = n;
}
};
int main()
{
stack s;
StackNew(&s,sizeof(Student));
Student *stu1 = new Student(1,"张三");
StackPush(&s,stu1);
Student stu2;
StackPop(&s,&stu2);
cout<<stu2.name<<endl;
delete stu1;
stu1 = 0;
return 0;
}
简单测试
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
int id;
string name;
Student(){}
Student(int i,char* n)
{
id = i;
name = n;
}
};
int main()
{
stack s;
StackNew(&s,sizeof(Student));
Student *stu1 = new Student(1,"张三");
StackPush(&s,stu1);
Student stu2;
StackPop(&s,&stu2);
cout<<stu2.name<<endl;
delete stu1;
stu1 = 0;
return 0;
}