现在的位置: 首页 > 综合 > 正文

纯c实现堆栈

2017年12月28日 ⁄ 综合 ⁄ 共 2105字 ⁄ 字号 评论关闭

上头文件

#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;
}
}

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



抱歉!评论已关闭.