[库]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;
}       

               
          
   
           
       

原创粉丝点击