大家写的顺序栈一般都是用数组实现,大小固定,一旦压栈数量超过栈大小则会发生越界!现在写一个用malloc和realloc实现的动态顺序栈,当压栈数量超过栈大小时,程序可根据所需求空间自动调节栈大小,以满足要求!代码如下,调试通过,放心使用!
此动态顺序栈的栈底空间设为空,不用来作为存放数据的有效空间,故当输入栈大小为N时栈实际可用空间为(N-1)即只能压栈(N-1)次,否则若将使用空间也定为N的话,将发生类似“DAMAGE:after Normal block(#51) at 0x..........”的错误提示,即“越界”错误,详见文章末!
#include
#include
#include
typedef int eletype;
#define INIT_SIZE 5
typedef struct stack
{
eletype *p_top;
eletype *p_bottom;
int stack_size;
}malloc_seqstack;
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);
int main(void)
{
int i = 0;
int num = 0;
int value = 0;
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;
}
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;
}
bool seqstack_full(malloc_seqstack *p_stack)
{
return p_stack->p_top - p_stack->p_bottom >= p_stack->stack_size-1;
}
bool seqstack_empty(malloc_seqstack *p_stack)
{
return p_stack->p_top <= p_stack->p_bottom;
}
void seqstack_push(malloc_seqstack *p_stack, int length, eletype value)
{
eletype *p_tmp = p_stack->p_bottom;
if (seqstack_full(p_stack))
{
printf("栈已满,系统将为其增加空间!\n");
p_stack->p_bottom =
(eletype *)realloc(p_stack->p_bottom, length*sizeof(eletype));
if (!p_stack->p_bottom)
{
free(p_tmp);
exit(-1);
}
p_stack->stack_size = length;
}
(p_stack->p_top)++;
*(p_stack->p_top) = value;
return;
}
eletype seqstack_pop(malloc_seqstack *p_stack)
{
eletype value = 0;
if (seqstack_empty(p_stack))
{
printf("栈已空!\n");
exit(-1);
}
value = *(p_stack->p_top--);
return value;
}
void seqstack_destroy(malloc_seqstack *p_stack)
{
free(p_stack->p_bottom);
free(p_stack);
p_stack->stack_size = 0;
p_stack->p_bottom = NULL;
p_stack->p_top = NULL;
p_stack = NULL;
return;
}
程序运行结果:
栈越界时提示的错误信息:
将C语言梳理一下,分布在以下10个章节中: