[库]C实现的泛型栈
来源:互联网 发布:如何删除指南针软件 编辑:程序博客网 时间:2024/05/22 03:45
/*
Name: stack.h
Copyright: 1.0
Author: avalon
Date: 02-10-04 19:48
Description: 泛型设计的栈
*/
#ifndef AVALON_STACK_H
#define AVALON_STACK_H
#include <stdio.h>
#ifndef AVALON_BOOL
#define AVALON_BOOL
#define TRUE 1
#define FALSE 0
typedef int BOOL;/*自定义的BOOL型*/
#endif
typedef struct Stack * StackHandle;/* 栈HANDLE */
/*******
接口
*******/
StackHandle InitStack(size_t size);
/*构造一个空栈*/
BOOL GetTop(StackHandle S,void * elem);
/*若栈不空,则用elem返回S的栈顶元素,并返回TRUE*/
BOOL Push(StackHandle S,void * elem);
/*插入元素,elem为新的栈顶元素*/
BOOL Pop(StackHandle S, void * elem);
/*若栈不空,则删除S的栈顶元素,并用elem返回其值,
并返回TRUE.elem也可取NULL值,则仅做弹出动作*/
BOOL ClearStack(StackHandle S);
/*把S置为空栈*/
BOOL DestroyStack(StackHandle * S);
/*销毁栈S*/
BOOL StackEmpty(StackHandle S);
/*栈空?*/
int StackLength(StackHandle S);
/*栈长*/
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
Name: stack.c
Copyright: 1.0
Author: avalon
Date: 02-10-04 19:48
Description: 泛型设计的栈
*/
#include <stdio.h>
#include <assert.h>
#include <mem.h>
#ifndef AVALON_BOOL
#define AVALON_BOOL
#define TRUE 1
#define FALSE 0
typedef int BOOL;
#endif
/*******
数据结构
*******/
typedef struct Node{
struct Node * prior ;/*前位置*/
void * data ;/**/
}Node, * NodeHandle;
typedef struct Stack{
NodeHandle base ;/*栈底*/
NodeHandle top ;/*栈顶*/
int size_of_stack;/*栈长*/
size_t size_of_data ;/**/
}Stack, * StackHandle;
/******
内部函数
******/
NodeHandle AllocNode(StackHandle S,void * elem)
{/*仅供内部使用专为分配空间*/
NodeHandle temp ;
size_t size;
assert( NULL!=S && NULL != elem);/**/
size = S->size_of_data;
temp= (NodeHandle)malloc(sizeof(Node));
assert( NULL != temp);
(temp->data) = (void *)malloc( size);
memcpy( temp->data, elem , size);
return temp;
}
BOOL FreeNode(NodeHandle * N)
{/*删除结点*/
assert( NULL != *N && NULL !=N);/**/
free( (*N)->data);
free( *N);
return TRUE;
}
/*******
外部接口
*******/
StackHandle InitStack( size_t size)
{/*构造一个空栈*/
StackHandle S = (StackHandle)malloc(sizeof(Stack));
assert( NULL !=S);/**/
S->top = S->base = NULL;
S->size_of_stack = 0;
S->size_of_data = size;
return S;
}
BOOL GetTop(StackHandle S,void * elem)
{/*若栈不空,则用elem返回S的栈顶元素,并返回TRUE*/
if(S==NULL || S->base == S->top)
return FALSE;
memcpy( elem,S->top->data, S->size_of_data);
return TRUE;
}
BOOL Push(StackHandle S,void * elem)
{/*插入元素,elem为新的栈顶元素*/
NodeHandle temp;
assert(NULL !=S);
assert(NULL !=elem);
temp= AllocNode(S,elem);/*分配一个结点*/
(S->size_of_stack)++;
temp->prior = S->top;
S->top = temp;
return TRUE;
}
BOOL Pop(StackHandle S, void * elem)
{/*若栈不空,则删除S的栈顶元素,并用elem返回其值,并返回TRUE
elem也可取NULL值,仅做弹出动作*/
NodeHandle temp;
if(0==S->size_of_stack)/*栈空*/
return FALSE;
temp=S->top->prior;
(S->size_of_stack)--;
if( NULL != elem)/*如果参数为NULL,则直接弹出*/
GetTop(S,elem);
FreeNode( &(S->top));
S->top = temp;
return TRUE;
}
BOOL ClearStack(StackHandle S)
{/*把S置为空栈*/
assert( NULL !=S);
while(0!=S->size_of_stack){
Pop(S,NULL);
}
return TRUE;
}
BOOL DestroyStack(StackHandle * S)
{/*销毁栈S*/
assert(NULL !=S);
assert(NULL != *S);
if(0!=(*S)->size_of_stack)
ClearStack(*S);
free( *S);
*S=NULL;
return TRUE;
}
BOOL StackEmpty(StackHandle S)
{/*栈空?*/
assert( NULL !=S );
if(0==S->size_of_stack)return TRUE;
return FALSE;
}
int StackLength(StackHandle S)
{/*栈长*/
assert(NULL !=S);
return S->size_of_stack;
}
- [库]C实现的泛型栈
- C实现的泛型栈
- C泛型栈的实现
- C实现的泛型栈
- C实现的泛型栈
- 泛型栈-C语言的简单实现
- [C/C++]汉诺塔的实现
- python调用C库的实现
- c++stl库list简单的实现
- kernel对应的c库实现
- C 标准库 atoi 函数的实现
- C 标准库 abs 函数的实现
- C 标准库 atof 函数的实现
- C 标准库 bsearch 函数的实现
- C 标准库 strcpy 函数的实现
- C 标准库 strcat 函数的实现
- C 标准库 strchr 函数的实现
- C 标准库 strcmp 函数的实现
- Linux权限问题_10_4:
- 中国WAP应用被运营商扼杀了
- hehe,测试一下。
- IT人员如是SAY
- 10.4 除了吃饭还是吃饭
- [库]C实现的泛型栈
- Exercise of Thread(1)
- 太原印象
- 迷宫求解
- 郁闷ing!
- 多国日历
- 美丽心情
- dotnetnuke的基本功能
- 一个C语言实现不含递归的高效快速排序算法