利用动态内存分配创建堆栈.h头文件并调用例程

1.首先,创建stack.h头文件,头文件中只用来声明函数及定义

/*一个堆栈模块的接口*/

#define STACK_TYPE int

/*push把一个新值压入堆栈,它的参数是需要压入的值*/

void push(STACK_TYPE value);

/*pop从堆栈中弹出一个值,并丢弃*/
void pop(void);

/*top返回堆栈顶元素,但不对堆栈进行修改*/
STACK_TYPE top(void);

/*is_empty如果堆栈为空返回TRUE否则返回FALSE*/
int is_empty(void);

/*is_full如果堆栈满返回TRUE否则返回FALSE*/
int is_full(void);

/*create_stack创建堆栈*/
void create_stack(size_t size);//size_t型变量用来选择足够大的无符号整形来代表该平台上最大可能出现的对象大小

/*destroy_stack销毁堆栈*/
void destroy_stack(void);

2.其次,创建函数.c文件

#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>


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_TYPE));
	assert(stack!=NULL);
}

//destroy_stack
void destroy_stack(void)
{
	assert(stack_size > 0);
	stack_size = 0;
	free(stack);
	stack = NULL;//释放内存后指针指向空
}

//push
void push(STACK_TYPE value)
{
	assert(!is_full());
	top_element += 1;
	stack[top_element] = value;
}

//pop
void pop(void)
{
	assert(!is_empty());
	top_element -= 1;
}

//top
STACK_TYPE top(void)
{
	assert(!is_empty());
	return stack[top_element];
}

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

//is_empty
int is_empty()
{
	assert(stack_size > 0);
	return top_element == -1;
}

3.测试程序调用头文件的声明

#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>

void main()
{
	create_stack(100);
	push(6);
	push(7);
	int value1 = top();
	printf("%d\n", value1);
	pop();
	int value2 = top();
	printf("%d\n", value2);
	destroy_stack();
//	printf("%d\n", top());
}

4.测试结果
利用动态内存分配创建堆栈.h头文件并调用例程