栈内每个元素的类型都是void*,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
struct SStack{
void * data[MAX];
int m_size;
};
typedef void* seqStack;
//初始化栈
seqStack Init_stack()
{
struct SStack * stack = (struct SStack *)malloc(sizeof(struct SStack));
if (stack == NULL)
{
return NULL;
}
//clear elements in the array
memset(stack->data, 0, sizeof(void *)*MAX);
stack->m_size = 0;
return stack;
}
//入栈
void Push_stack(seqStack stack, seqStack data)
{
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
//判断栈是否满了
//stack->不会有size,要把它还原成真实的结构体
struct SStack * mystack = (struct SStack *)stack;
if (mystack->m_size == MAX)
{
return;
}
mystack->data[mystack->m_size] = data;
mystack->m_size++;//更新栈大小
}
//出栈
void pop_stack(seqStack stack)
{
if (stack == NULL)
{
return;
}
struct SStack * mystack = (struct SStack *)stack;
if (mystack->m_size == 0)//空栈返回
{
return;
}
mystack->data[mystack->m_size - 1] = NULL;
mystack->m_size--;
}
//获取栈顶元素
void * Top_stack(seqStack stack)
{
if (stack == NULL)
{
return NULL;
}
struct SStack * mystack = (struct SStack *)stack;
if (mystack->m_size == 0)
{
return NULL;
}
return mystack->data[mystack->m_size - 1];
}
//访问栈的大小
int Size_stack(seqStack stack)
{
if (stack == NULL)
{
return NULL;
}
struct SStack * mystack = (struct SStack *)stack;
return mystack->m_size;
}
//判断栈是否为空
int Empty_stack(seqStack stack)
{
if (stack == NULL)
{
return -1;//真,为空栈
}
struct SStack * mystack = (struct SStack *)stack;
if (mystack->m_size == 0)
{
return 1;//空栈,为真
}
return 0;//不是空栈,为假
}
//销毁栈
void Destroy_stack(seqStack stack)
{
if (stack == NULL)
{
return;
}
free(stack);
stack = NULL;
}
//测试
typedef struct person{
char name[40];
int age;
}person;
void test()
{
//prepare datas
person p1 = { "aaa", 12 };
person p2 = { "bbb", 13 };
person p3 = { "ccc", 14 };
person p4 = { "ddd", 15 };
person p5 = { "eee", 16 };
//初始化栈
seqStack stack = Init_stack();
//入栈
Push_stack(stack, &p1);
Push_stack(stack, &p2);
Push_stack(stack, &p3);
Push_stack(stack, &p4);
Push_stack(stack, &p5);
int size = Size_stack(stack);
printf("栈的大小为:%d\n", size);
while (Empty_stack(stack) == 0)
{
person * pTop = (person *)Top_stack(stack);
printf("姓名是:%s,年龄是:%d\n", pTop->name, pTop->age);
pop_stack(stack);
}
int size_t = Size_stack(stack);
printf("栈的大小为:%d\n", size_t);
Destroy_stack(stack);
}
int main()
{
test();
return 0;
}