通用栈(c实现)

c语言实现的通用栈,可存放各种数据类型.

cstack.h文件

#pragma once


typedef struct Node
{
void *pdata;
struct Node *pnext;
}Node,*PNode;


typedef struct CStack
{
int count;
int data_size;
Node *phead;
}CStack,*PCStack;


void InitStack(PCStack ps,int data_size);


bool Push(PCStack ps,void *pdata);


//获取栈顶值,但不删除
bool GetTop(PCStack ps,void *rtval);


//获取栈顶值,并且删除
bool Pop(PCStack ps,void *rtval);


bool IsEmpty(PCStack ps);


int GetLength(PCStack ps);


void Clear(PCStack ps);


void Destroy(PCStack ps);



csatck.cpp文件

#include<stdlib.h>
#include<assert.h>
#include"cstack.h"
#include<memory.h>


void InitStack(PCStack ps,int data_size)
{
assert(ps != NULL);
if(ps==NULL && data_size<0)
{
return ;
}


ps->count = 0;
ps->data_size = data_size;
ps->phead = NULL;
}


static Node* BuyNode(PCStack ps,void *pdata)
{
Node *p = (Node*)malloc(sizeof(Node));
p->pdata =(char *) malloc(ps->data_size);


assert(p!=NULL && p->pdata!=NULL);

char *pd = (char *)pdata;
memcpy(p->pdata,pd,ps->data_size);


return p;
}


bool Push(PCStack ps,void *pdata)
{
Node *p = BuyNode(ps,pdata);


p->pnext = ps->phead;
ps->phead = p;


ps->count++;


return true;
}


//获取栈顶值,但不删除
bool GetTop(PCStack ps,void *rtval)
{
if(IsEmpty(ps))
{
return false;
}


char *rt = (char *)rtval;
char *tmp = (char*)ps->phead->pdata;


memcpy(rt,tmp,ps->data_size);


return true;
}


//获取栈顶值,并且删除
bool Pop(PCStack ps,void *rtval)
{
if(IsEmpty(ps))
{
return false;
}


Node *p = ps->phead;
char *rt = (char *)rtval;
char *tmp = (char*)p->pdata;


memcpy(rt,tmp,ps->data_size);


ps->phead = p->pnext;


free(p->pdata);
free(p);


ps->count--;


return true;
}


bool IsEmpty(PCStack ps)
{
    return ps->phead == NULL;
}


int GetLength(PCStack ps)
{
return ps->count;
}


void Clear(PCStack ps)
{
Destroy(ps);
}


void Destroy(PCStack ps)
{
Node *p;


while(ps->phead != NULL)
{
p = ps->phead;
ps->phead = p->pnext;
free(p->pdata);
free(p);
}


ps->count = 0;
}



下面是我自己设计的测试用例:

#include<stdio.h>
#include<assert.h>
#include<vld.h>
#include"cstack.h"


int main()
{
CStack ss;
InitStack(&ss,sizeof(char*));

char *p[8] = {"123","1234","12345","abc","abcd","xyz","123abcd","123abcdxyz"};

int i;
char* ptmp;


for(i=0 ; i<8 ; i++)
{
Push(&ss,(void*)&p[i]);
}


while(!IsEmpty(&ss))
{
GetTop(&ss,(void*)&ptmp);
printf("%s\n",ptmp);
Pop(&ss,(void*)&ptmp);
}
Destroy(&ss);


CStack s;
InitStack(&s,sizeof(char));


char *str = "abcd1234xyz";
char tmp;


for(i=0 ; str[i]!=NULL ; i++)
{
Push(&s,(void*)&str[i]);
}


while(!IsEmpty(&s))
{
GetTop(&s,(void*)&tmp);
printf("%c ",tmp);
Pop(&s,(void*)&tmp);
}
printf("\n");


Destroy(&s);


CStack sd;
InitStack(&sd,sizeof(int));


int dtmp;


for(i=0 ; i<20 ; i++)
{
Push(&sd,(void*)&i);
}


while(!IsEmpty(&sd))
{
GetTop(&sd,(void*)&dtmp);
printf("%d ",dtmp);
Pop(&sd,(void*)&dtmp);
}
printf("\n");

return 0;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值