堆栈的数组实现(完整版)

最开始的时候都是简单的实现,很多问题没有考虑,现在将堆栈重新实现一遍(数组表示);


实现三步骤

  • 确定堆栈的结构,实现思路
  • 考虑程序健壮性,边界情况等
  • 函数实现(多种功能)

对于堆栈,特征是先入后出;

几个功能函数分别是

  • pop
  • push
  • top(只返回栈顶值,但是不删除,栈维持原样)

1、静态数组堆栈

栈的结构体表示如下:

#define STACK_TYPE int
#define STACK_SIZE 100

typedef struct{
	STACK_TYPE content[STACK_SIZE];
	int top;
}stack;

函数接口设计如下:

void stack_init(stack **, int );
void push(stack *,STACK_TYPE);
STACK_TYPE pop(stack *);
STACK_TYPE Top(stack *);

要使用堆栈,首先要对其进行初始化(当然,在用完后,要记住对其的释放,或者写一个释放函数与初始化函数对应):

/*这里要注意,传入的参数一定要指向指针的指针,否则无法获得修改后的指针(传值不传址)*/
void stack_init(stack **a, int size)
{
	int i;
	if(a == NULL || size <=0){
		printf("the parameters is illegal\n");
		exit(-1);
	}

	*a = (stack *)malloc(sizeof(stack));
	
	for(i=0; i<size; i++)
		(*a)->content[i] = 0;
	
	(*a)->top = -1;
}	

初始化后,可以获得指向堆栈的指针,后续都是对指向堆栈结构体记性操作

首先是push操作

void push(stack *stack, STACK_TYPE input)
{
	assert(!is_full(stack));     //如果值为真,则继续执行(if_full为0,表示未满)
	stack->top += 1;               
	stack->content[stack->top] = input;     
}

在push操作中,要用到is_full函数,用来判断堆栈是否满,代码如下:

static int is_full(stack *stack)
{
	return stack->top > STACK_SIZE - 1;
}
最开始的时候使用return stack->top == STACK_SIZE - 1,但是如果别人一次加2个数,就有可能跳过该判断,导致溢出


然后是pop()操作

STACK_TYPE pop(stack *stack)
{
	//assert(!is_empty());
	STACK_TYPE temp;

	if(is_empty(stack))
		return -1;
	temp = stack->content[stack->top];
	stack->content[stack->top] = 0;
	stack->top -= 1;
	
	return temp;
}
其中用到了is_empty()函数,用来判断堆栈是否为空,如果为空,就不能继续pop
static int is_empty(stack *stack)
{
	return stack->top <= -1;
}

top代码如下

STACK_TYPE Top(stack *stack)
{
	//assert(!is_empty());
	if(is_empty(stack))
		return -1;
	return stack->content[stack->top];
}


2、动态数组堆栈

上面使用的数组大小是固定的,如果需要动态的堆栈怎么办?下面是动态数组的实现方法

堆栈结构体表示如下:

typedef struct{
	STACK_TYPE *content;
	int top;
}stack;

下面的工作就是按需求对其进行初始化,stack_init的第二个参数size又起到了更重要的作用,不仅仅是用来初始化数组,而且用来定义数组的长度

/*这里要注意,传入的参数一定要指向指针的指针,否则无法获得修改后的指针(传值不传址)*/
void stack_init(stack **a, int size)
{
	int i;
	if(a == NULL || size <=0){
		printf("the parameters is illegal\n");
		exit(-1);
	}

	*a = (stack *)malloc(sizeof(stack));
	(*a)->content = (STACK_TYPE *)malloc(size*sizeof(STACK_TYPE));
	
	for(i=0; i<size; i++)
		(*a)->content[i] = 0;
	
	(*a)->top = -1;
}	







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值