经典抽象数据类型之堆栈实现(动态数组)

来源:互联网 发布:软件开发部门职位 编辑:程序博客网 时间:2024/05/29 16:40
/*
** author: gooly.oh
** description: 一个动态分配数组实现的堆栈
** 堆栈的长度在创建堆栈的函数被调用时给出,该函数必须在任何其他操作堆栈函数之前调用
*/


#define STACK_TYPEint


static STACK_TYPE*stack;
static size_t stack_size;
static int top_element = -1;


/*
** create_stack
*/
void 
create_stack(size_t size)
{
assert(stack_size == 0);
stack_size = size;
stack = (STACK_TYPE *)malloc(stack_size * sizeof(STACK_SIZE));
assert( stack != NULL);
}


/*
** destory_stack
*/
void
destory_stack(void)
{
assert(stack_size > 0);
stack_size = 0;
free(stack);
stack = NULL;
}


/*-----------------------------------------------------------------------
**name: push
**function: 把一个新值压栈
**param: 被压入的值
*/
void 
push(STACK_TYPE value)
{
assert(!is_full());
stack[++top_element] = value;
}


/*-----------------------------------------------------------------------
**name: pop
**function: 从堆栈中弹出一个值,并将其丢弃
*/
void 
pop(void)
{
assert(!is_empty());
top_element--;
}


/*-----------------------------------------------------------------------
**name: top
**function: 返回堆栈顶部元素的值,但不对堆栈进行修改
*/
STACK_TYPE top(void)
{
assert(!is_empty());
return stack[top_element];
}


/*-----------------------------------------------------------------------
**name: is_empty
**function: 如果堆栈为空,返回TRUE,否则返回FALSE
*/
int 
is_empty(void)
{
assert(stack_size > 0);
return top_element == -1;
}








/*-----------------------------------------------------------------------
**name: is_full
**function: 如果堆栈已满,返回TRUE,否则返回FALSE
*/


int is_full(void)
{
assert(stack_size > 0);
return top_element = STACK_SIZE - 1;
}