// 先进先出 存储指针 【* void】的栈
https://tool.lu/coderunner/ 【在线编译】
// 通用型栈 存放的值为 void* 指针
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_SIZE (1024*4)
typedef struct
{
void **top; //栈指针
void **end; //栈底
size_t count; //栈的大小
}STACK;
typedef struct
{
char name[20] ;
int age;
}student;
/*创建并初始化一个栈
参数:无
返回值:指向一个站的指针
*/
STACK * creatStack()
{
STACK *stack=(STACK *)malloc(sizeof(STACK));
if(stack==NULL)
return NULL;
memset(stack,0,sizeof(STACK));
stack->top=(void **)malloc(STACK_SIZE);
if(stack->top==NULL)
{
free(stack);
return NULL;
}
stack->count=STACK_SIZE/4;
stack->end=stack->top;
return stack;
}
/*清空一个栈*/
void cleanStack(STACK *stack)
{
stack->top=stack->end;
memset(stack->top,0,STACK_SIZE);
return;
}
/*判断一个栈是为空栈*/
int isEmptyStack(STACK *stack)
{
if(stack->top==stack->end)
return 1;
else
return 0;
}
/*判断一个栈是否为满栈
参数:栈指针
返回值:满栈返回1,否则返回0;
*/
int isFullStack(STACK *stack)
{
if(stack->end+1024==stack->top)
return 1;
else
return 0;
}
/*数据入栈操作
参数1:栈指针
参数2:数据对象
返回值:成成返回0,失败返回-1;
*/
int pushbackStack(STACK * stack,void *data)
{
if( ! isFullStack(stack) )
{
*(stack->top)=data;
stack->top++;
return 0;
}
else
return -1;
}
/*数据出栈操作
参数:栈指针
返回值:返回出栈的数据指针;
*/
void* popStack(STACK *stack)
{
if( ! isEmptyStack(stack))
{
stack->top--;
return (void*)(*(stack->top));
}
else
return NULL;
}
/*测试如下*/
int main()
{
int number1=10;
int number2=20;
int number3=30;
int *p;
STACK *stack=creatStack();
// 放入堆栈 int 整数
pushbackStack(stack,&number1);
pushbackStack(stack,&number2);
pushbackStack(stack,&number3);
p=(int *)popStack(stack);
printf("%d\n",*p);
p=(int *)popStack(stack);
printf("%d\n",*p);
p=(int *)popStack(stack);
printf("%d\n",*p);
// 放入堆栈 字符串
char* st1 = "aaa";
char* st2 = "bbb";
char* st3 = "ccc";
pushbackStack(stack,st1);
pushbackStack(stack,st2);
pushbackStack(stack,st3);
char *q;
q=(char *)popStack(stack);
printf("%s\n",q);
q=(char *)popStack(stack);
printf("%s\n",q);
q=(char *)popStack(stack);
printf("%s\n",q);
student* student1 = (student*)malloc(sizeof(student));
student* student2 = (student*)malloc(sizeof(student));
student* student3 = (student*)malloc(sizeof(student));
strcpy(student1->name,"xiaoMing");
strcpy(student2->name,"xiaoHei");
strcpy(student3->name,"xiaoBai");
student1->age = 10;
student2->age = 20;
student3->age = 30;
// 放入堆栈 结构体 struct
pushbackStack(stack,student1);
pushbackStack(stack,student2);
pushbackStack(stack,student3);
student* studentTemp;
studentTemp=(student *)popStack(stack);
printf("[name:%s age:%d]\n",studentTemp->name,studentTemp->age);
studentTemp=(student *)popStack(stack);
printf("[name:%s age:%d]\n",studentTemp->name,studentTemp->age);
studentTemp=(student *)popStack(stack);
printf("[name:%s age:%d]\n",studentTemp->name,studentTemp->age);
return 0;
}
//
//输出结果:
//30 20 10 ccc bbb aaa
//[name:xiaoBai age:30]
//[name:xiaoHei age:20]
//[name:xiaoMing age:10]
//
//
//