顺序栈(数组栈)C语言实现

#include <stdio.h>
#include <stdlib.h>
/*顺序栈(数组栈)*/
#define STACK_SIZE 100
#define STACK_ADD_SIZE 10

typedef struct stack{
	int *base;
	int *top;
	int stack_size;
}stack_unit,*Stack;

int
stack_init(Stack *St, int size)
{
	stack_unit *p;
	
	p = malloc(sizeof(stack_unit));//先申请一个数据结构保存栈的信息
	if( p == NULL ){
		printf("stack init failed[malloc]\n");
		return -1;
	}
	p->base = p->base = NULL;
	p->stack_size = size;
	*St = p;

	(*St)->base = malloc(size * sizeof(int));
	if( (*St)->base ==NULL ){
		printf("stack init failed\n");
		return -1;
	}
	(*St)->top = (*St)->base;

	return 0;
}

int
stack_push(Stack *St, int value)
{
	Stack p = *St;
	int *temp;
	if( (p->top - p->base) >= p->stack_size ){//stack full
		temp = p->base;

                //p->base = realloc(p->base, p->stack_size + STACK_ADD_SIZE);错误

		p->base = realloc(p->base, (p->stack_size + STACK_ADD_SIZE)*sizeof(int));
		if(p->base == NULL){
			printf("stack push failed[remalloc]\n");
			p->base = temp;
			return -1;			
		}
		p->top = p->base + p->stack_size;
		p->stack_size = p->stack_size + STACK_ADD_SIZE;
	}
	*(p->top) = value;
	p->top++;

	//printf("p->base = %x p->top = %x\n",p->base, p->top);
	return 0;
}

int 
stack_pop(Stack *S)
{
	int value;
	Stack p = *S;

	if( p->base == p->top ){
		printf("      p->base = %x p->top = %x\n",p->base, p->top);
		return -1;
	}
	p->top--;
	value = *(p->top);
	return value;	
}

int 
stack_print(Stack *S)
{
	Stack p = *S;
	int *temp = p->top;
	while( p->base != p->top ){
		p->top--;
		printf("%d ",*(p->top));
	};
	p->top = temp; //恢复top
	printf("\n");
	return 0;
}



int 
main(void)
{
	int i, value;
	Stack S = NULL;
	
	stack_init(&S, STACK_SIZE);
	for(i = 0; i < 105; i++){
		stack_push(&S, i);
	}
	stack_print(&S);

	value = stack_pop(&S);
	printf("the pop data is %d\n",value);
	stack_print(&S);
	return 0;
}

    

    当push <= 100时,栈的内存地址不变,数据稳定。如下图:

    当push > 100时,栈的内存地址可能改变,数据不稳定。如下图:

    问题定位:栈初始大小是100,当push超过100后使用realloc,在复制旧的数据块时发生错误!

    改正:p->base = realloc(p->base, (p->stack_size + STACK_ADD_SIZE)*sizeof(int));

OK! 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值