【数据结构】4.栈(C语言)

【数据结构】——4.栈

一、栈的概念及结构

1. 栈的概念

栈(Stack):一种特殊的线性表,只允许固定的一端插入和删除。进入数据插入和删除操作的一端称为栈顶,另一端称为栈底

​ 栈元素遵守后进先出LIFO(Last in First Out)原则

​ 栈顶插入也叫入栈、进栈,删除也叫做出栈、弹栈

​ 栈可分为顺序栈和链栈

​ 系统栈:是操作系统的概念,用内存进行区域划分,创建函数栈帧时就会使用,与我们实现的栈不同,我们的栈在堆空间内申请,用于数据的存储操作。

查看源图像

2. 顺序栈结构定义

typedef int STDataType;

typedef struct Stack
{
	STDataType* data;	//栈空间数组
	int top;		//栈顶位置
	int capacity;	//栈容量
} Stack;

二、栈的实现

1. 初始化

  1. 这里传入二级指针,先为Stack分配空间,扩容时再为data域分配空间
  2. 初始化时将各成员变量赋初值
void StackInit(Stack** pps)
{
	assert(pps != NULL);
	*pps = (Stack*)malloc(sizeof(Stack));
	if (*pps == NULL)
	{
		perror("malloc fail\n");
		exit(-1);
	}

	(*pps)->data = NULL;
	(*pps)->capacity = 0;
	(*pps)->top = 0;
}

2. 入栈

  1. 先检查是否栈满,若是满了,则进行扩容(这里以2倍的方式扩容)
  2. 再将数据插入栈顶,栈顶指针上移
void StackPush(Stack* ps, STDataType x)
{
	assert(ps != NULL);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* temp = (STDataType*)realloc(ps->data, newcapacity * sizeof(STDataType));
		if (temp == NULL)
		{
			perror("realloc fail\n");
			exit(-1);
		}
		ps->capacity = newcapacity;
		ps->data = temp;
	}
	ps->data[ps->top] = x;
	ps->top++;
}

3. 出栈

  1. 出栈仅仅只是对栈顶指针下移即可
  2. 出栈前先检查是否为空,这里对为空的情况不做处理
void StackPop(Stack* ps)
{
	assert(ps != NULL);

	if (ps->top == 0)
	{
		return;
	}

	ps->top--;
}

4. 获取栈顶元素

​ 获取之前先判断栈是否为空

STDataType StackTop(Stack* ps)
{
	assert(ps != NULL);
	assert(ps->top != 0);
	return ps->data[ps->top - 1];
}

5. 获取栈元素个数

​ 栈顶减栈底就是栈元素个数

size_t StackSize(Stack* ps)
{
	return (size_t)(ps->top);
}

6. 判断栈是否为空

_Bool StackEmpty(Stack* ps)
{
	assert(ps != NULL);
	return ps->top == 0;
}

7. 栈的销毁

​ 先销毁data空间,再销毁stack空间

void StackDestroy(Stack** pps)
{
	assert(pps != NULL);
	free((*pps)->data);
	free(*pps);
	*pps = NULL;
}

三、完整代码

代码保存在gitee中:点击完整代码参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值