#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1024
//节点的结构体
struct stackNode
{
//只维护指针域
stackNode* next;
};
//栈的结构体
struct lstack
{
//这里头节点不写成指针形式,是因为栈的结构体会开辟在堆区
//如果头节点用指针形式表示,就要用头节点指针指向一个开辟在堆区的头节点
//这样释放的时候会很麻烦
stackNode pheader;
int size; //长度
};
typedef void* seqStack;
//栈的初始哈
seqStack init_stack()
{
//先在堆区开辟一块内存存放栈的结构体
lstack* stack = (lstack*)malloc(sizeof(lstack));
//判断空间开辟是否成功
if (stack == NULL)
return NULL;
//栈的初始化
stack->pheader.next = NULL;
stack->size = 0;
return stack;
}
//入栈:头插
void push_stack(seqStack stack,void* data)
{
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
lstack* mystack = (lstack*)stack;
//只获取用户传入自定义类型前面四个字节的大小,即得到指针域接口
stackNode* newNode = (stackNode*)data;
//头插
newNode->next = mystack->pheader.next;
mystack->pheader.next = newNode;
//长度++
mystack->size++;
}
//出栈:头删
void pop_stack(seqStack stack)
{
if (stack == NULL)
return;
lstack* mystack = (lstack*)stack;
//头删
stackNode* firstNode = mystack->pheader.next;
mystack->pheader.next =firstNode->next;
//free(mystack->pheader.next) 错误,因为不知道用户传入的数据是咋堆区还是栈区创建
//长度--
mystack->size--;
}
//返回栈顶元素
seqStack top_stack(seqStack stack)
{
if (stack == NULL)
return NULL;
lstack* mystack = (lstack*)stack;
if (mystack->size == 0)
return NULL;
return mystack->pheader.next;
}
//返回栈的大小
int size_stack(seqStack stack)
{
if (stack == NULL)
return NULL;
lstack* mystack = (lstack*)stack;
return mystack->size;
}
//判断栈是否为空
bool empty_stack(seqStack stack)
{
if (stack == NULL)
return true;
lstack* mystack = (lstack*)stack;
if (mystack->size == 0)
return true;
return false;
}
//销毁栈
void destroy_stack(seqStack stack)
{
if (stack == NULL)
return;
free(stack);
stack = NULL;
}
//测试代码:
//--------------------------------------------
struct person
{
void* next;
char name[32];
int age;
};
int main()
{
seqStack stack=init_stack();
person p1 = {NULL,"大忽悠",19 };
person p2 = { NULL,"like",18 };
person p3 = {NULL,"小朋友",19 };
//入栈
push_stack(stack, &p1);
push_stack(stack, &p2);
push_stack(stack, &p3);
if (empty_stack(stack))
{
printf("栈为空\n");
}
else {
printf("不为空\n");
}
//返回栈的元素个数
int size = size_stack(stack);
printf("元素个数:%d\n", size);
//通过出栈的操作来遍历
while (empty_stack(stack)==false)
{
//弹出栈顶后
person *p=(person*)top_stack(stack);
printf("姓名:%s\t年龄:%d\n",p->name,p->age);
//出栈
pop_stack(stack);
}
//返回栈的元素个数
size = size_stack(stack);
printf("元素个数:%d\n", size);
//销毁栈
destroy_stack(stack);
size = size_stack(stack);
printf("元素个数:%d\n", size);
return 0;
}