设为首页 加入收藏

TOP

动态顺序栈的C语言实现(一)
2014-11-23 21:36:06 】 浏览:306
Tags:动态 顺序 语言 实现

大家写的顺序栈一般都是用数组实现,大小固定,一旦压栈数量超过栈大小则会发生越界!现在写一个用malloc和realloc实现的动态顺序栈,当压栈数量超过栈大小时,程序可根据所需求空间自动调节栈大小,以满足要求!代码如下,调试通过,放心使用!


此动态顺序栈的栈底空间设为空,不用来作为存放数据的有效空间,故当输入栈大小为N时栈实际可用空间为(N-1)即只能压栈(N-1)次,否则若将使用空间也定为N的话,将发生类似“DAMAGE:after Normal block(#51) at 0x..........”的错误提示,即“越界”错误,详见文章末!


/************************************************
运行平台:vc++6.0
实现功能:利用realloc实现动态顺序栈(栈空间可增大)
************************************************/
#include
#include
#include

typedef int eletype; /* 重新定义元素类型 */

#define INIT_SIZE 5 /* 栈初始大小 */

/* 定义一个可以操作动态顺序栈的结构体 */
typedef struct stack
{
eletype *p_top; /* 栈顶指针 */
eletype *p_bottom; /* 栈底指针 */
int stack_size; /* 栈大小 */
}malloc_seqstack; /* 动态顺序栈malloc_sequence_stack */

/*****************栈基本操作函数声明********************/
void seqstack_init(malloc_seqstack *p_stack, int init_size);
bool seqstack_full(malloc_seqstack *p_stack);
bool seqstack_empty(malloc_seqstack *p_stack);
void seqstack_push(malloc_seqstack *p_stack, int length, eletype value);
eletype seqstack_pop(malloc_seqstack *p_stack);
void seqstack_destroy(malloc_seqstack *p_stack);
/*******************************************************/


/********************************************************
*函数名称:main
*函数功能:程序入口
*入口参数:空
*返 回 值:0
********************************************************/
int main(void)
{
int i = 0;
int num = 0;
int value = 0;

/*******在栈中为结构体分配空间*******
malloc_seqstack stack;
malloc_seqstack *p_stack = &stack;
************************************/

/*******在堆中为结构体分配空间*******/
malloc_seqstack *p_stack = (malloc_seqstack *)malloc(sizeof(malloc_seqstack));


seqstack_init(p_stack, INIT_SIZE);

printf("请输入需要的动态顺序栈大小:\n");
scanf("%d", &num);

printf("请输入%d个数值:\n", num-1);
for(i=0; i {
scanf("%d", &value);
seqstack_push(p_stack, num, value);
}

printf("依次出栈:\n");
for(i=0; i {
printf("%3d", seqstack_pop(p_stack));
}
printf("\n\n");

seqstack_destroy(p_stack);

return 0;
}

/********************************************************
*函数名称:seqstack_init
*函数功能:初始化动态顺序栈
*入口参数:p_stack为指向结构体指针
init_size为栈初始大小
*返 回 值:空
********************************************************/
void seqstack_init(malloc_seqstack *p_stack, int init_size)
{
p_stack->p_bottom = (eletype *)malloc(init_size * sizeof(eletype));

if (p_stack->p_bottom == NULL)
{
exit(-1);
}
p_stack->p_top = p_stack->p_bottom;
p_stack->stack_size = init_size;

return;
}

/********************************************************
*函数名称:seqstack_full
*函数功能:判断栈是否为满
*入口参数:p_stack为指向结构体指针
*返 回 值:1为满,0为非满
********************************************************/
bool seqstack_full(malloc_seqstack *p_stack)
{
return p_stack->p_top - p_stack->p_bottom >= p_stack->stack_size-1;
}

/********************************************************
*函数名称:seqstack_empty
*函数功能:判断栈是否为空
*入口参数:p_stack为指向结构体指针
*返 回 值:1为空,0为非空
********************************************************/
bool seqstack_empty(malloc_seqstack *p_stack)
{
return p_stack->p_top <= p_stack->p_bottom;
}

/********************************************************
*函数名称:seqstack_push
*函数功能:压栈
*入口参数:p_stack为指向结构体指针
length为欲压栈的数据

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[Python]xlrd 读取excel 日期类型.. 下一篇详解realloc函数的功能——C语言..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目