纯c实现堆栈

上头文件

#ifndef MY_STACK_H
#define MY_STACK_H


 #ifdef __cplusplus
 extern "C"{
 #endif
#define  TRUE   1
#define  FALSE  0


typedef int (*compapare)(void *data1, void *data2); //比较函数
typedef void (*FreeFunc) (void *data);
typedef  struct _My_Stack
{
void ** data;      //存储空间基地址
   unsigned int size; //栈大小
int top;           //栈顶指针
FreeFunc freeF;
}MyStack;


void InitStack(MyStack ** s, int size, FreeFunc freeF); //初始化一个大小为size的栈


void DestroyStack(MyStack *s); //销毁栈


void PushStack(MyStack *s, void *data); //进栈


void PopStack(MyStack *s);     //出栈


    int Stack_IsFull(MyStack *s);  //栈是否饱了,c没有bool


int Stack_IsEmpty(MyStack *s);   //栈是否饿了 c没有bool


int Stack_Lenght(MyStack *s);    //栈的长度


void *Stack_Top(MyStack *s);   //返回栈顶元素


int Stack_FindDataWithCompare(MyStack *s, void *data, compapare f); //查找指定饭的位置


void * Stack_GetDataWithIndex(MyStack *s, unsigned int index);  //通过序列返回饭


void Stack_Clean(MyStack *s);


 #ifdef __cplusplus
 }
 #endif


#endif

源文件

#include "myStack.h"
#include "malloc.h"
#include "string.h"


void InitStack(MyStack **s,int size, FreeFunc freeF)
{
*s = (MyStack *)malloc(sizeof(MyStack));
if(*s== NULL)
{
return;
}
memset(*s, 0, sizeof(MyStack));
(*s)->size = size;
(*s)->freeF = freeF;
(*s)->top = -1; //这个-1是有原因的.为了好处理第一个存储时top++;
(*s)->data = (void **)malloc(size* sizeof(void*));
}


void PushStack(MyStack *s, void *data)
{
if(Stack_IsFull(s) == TRUE)
{
return;
}
s->top++;
s->data[s->top] = data;
}


void PopStack(MyStack *s)
{
if(Stack_IsEmpty(s) == TRUE)
{
return;
}
s->freeF(s->data[s->top]);
s->top--;
}
void* Stack_Top(MyStack *s)
{
if(Stack_IsEmpty(s) == TRUE)
return NULL;
return s->data[s->top];
}


int Stack_FindDataWithCompare(MyStack *s, void *data, compapare f)
{
int index = 0 ;
if(Stack_IsEmpty(s) ==TRUE)
{
return -1;
}
for(index = 0; index<s->top+1; index++)
{
if(f(data, s->data[index]) == FALSE)
{
return index;
}
}
return -1;
}
void * Stack_GetDataWithIndex(MyStack *s, unsigned int index)
{
if(index> s->size+1 || index>s->top)
{
return NULL;
}
return s->data[s->top] ;
}


void Stack_Clean(MyStack *s)
{
while(!Stack_IsEmpty(s))
{
PopStack(s);
}
}
int Stack_IsFull(MyStack *s)
{
return s->top == s->size-1;
}


int Stack_IsEmpty(MyStack *s)
{
return s->top == -1;
}


int Stack_Lenght(MyStack *s)
{
return s->top;
}




void DestroyStack(MyStack *s)
{
if(s->size == 0) return;
if(s->top == 0) return;
if(s)
{
Stack_Clean(s);


free(s->data);
   s->data = NULL;
s = NULL;
}
}


自己参照别人写的,没什么改进.只是发出来鼓励一下自己



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值