通用型栈【存放的值为void* 指针】

// 先进先出 存储指针 【* 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]
//
//
//
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值