栈的使用

最近学习数据结构中对其中的栈有所总结

首先要清楚栈是一种链式的数据结构,栈的原则是先进后出,额。。。用一个形象的比喻来形容便是穿裤子和脱裤子这个行为,所以我们将穿裤子这个动作叫做压栈,将脱裤子这个行为叫做出栈,将没穿裤子叫做空栈。

 先看下面这一段定义

#define Max 100 
struct stack
{
    int* top;
    int* base;
    int max_size;//当前个数
}; 
typedef struct stack stack;

 

 记住上面这个图,我们以上都围绕着这个图来讲述,

 base指针当作栈底和用来申请内存,可以用malloc函数申请Max大小个,重所周知malloc函数申请的内存是连续的便可以和当成数组去使用,所以我们便可以用top也一起指向这个内存,当这个top与base指向同一个地方时便是空栈,每放进去一个元素top便自增,可以让top指针一直指向最后一个元素的下一个地址,所以我们现在就可以初始化这个栈

stack* creatStack()
{
	stack* stack = (struct stack*)malloc(sizeof(struct stack));
	stack->base = (int *)malloc(sizeof(int)*Max);//一次申请Max个int数据类型大小的内存
	assert(stack->base);
	stack->top = stack->base;
	stack->max_size = 0;
	return stack;
}

 入栈要注意栈是否满了,所以便可以使用这个max_size这个值去判断

将每一个要放入的元素的值赋值给top所指向的内存。(切记是先赋值top再++)

void pushStack(stack* stack, int x)
{
	if (stack->max_size>Max)//stack->max_size>Max时数据满了,退出这个函数
		return;
	*(stack->top)= x;//将每一个要放入的元素的值赋值给top所指向的内存
	stack->top++;
	stack->max_size++;
}

 出栈注意先出栈top再--

void popStack(stack* stack)
{
	int x = 0;
	printf("出栈后的元素");
	while (stack->max_size != 0)
	{
		stack->top--;
		x = *(stack->top);
		stack->max_size--;
		printf("%d ",x );
	}
}

综上所述,再加上主函数便可以构成这个栈啦

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define Max 100
 struct stack
{
	int* top;
	int* base;
	int max_size;//当前个数
};
typedef struct stack stack;
stack* creatStack()
{
	stack* stack = (struct stack*)malloc(sizeof(struct stack));
	stack->base = (int *)malloc(sizeof(int)*Max);
	assert(stack->base);
	stack->top = stack->base;
	stack->max_size = 0;
	return stack;
}
void pushStack(stack* stack, int x)
{
	if (stack->max_size>Max)
		return;
	*(stack->top)= x;
	stack->top++;
	stack->max_size++;
}
void popStack(stack* stack)
{
	int x = 0;
	printf("出栈后的元素");
	while (stack->max_size != 0)
	{
		stack->top--;
		x = *(stack->top);
		stack->max_size--;
		printf("%d ",x );
	}
}
int main(void)
{
	int a=0;
	stack* stack = creatStack();
	for (int i = 0;i <10;i++)
	{
		pushStack(stack, i);
	}
	popStack(stack);
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值