/*
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;