上头文件
#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;
}
}
自己参照别人写的,没什么改进.只是发出来鼓励一下自己