小工具      在线工具  汉语词典  css  js  c++  java

006 数据结构_栈——“C”

数据结构,c语言,开发语言 额外说明

收录于:196天前

前言

小留言:哈喽!各位CSDN的uu们,我是你的好友Fan_558,本文是Fan——数据结构与算法学习之路专栏的第6篇文章,本文采用数组的形式实现栈,希望我的文章可以给您带来一定的帮助

在这里插入图片描述

本文已通过如下测试用例,请放心学习哦!

void Test1()
{
    
	Stack ps;				//通过结构体类型创建结构体变量
	StackInit(&ps);			//初始化
	StackPush(&ps, 1);		//入栈
	StackPush(&ps, 2);		//入栈
	printf("元素个数为:%d\n ", StackSize(&ps)); 	//获取元素个数
	StackPush(&ps, 3);		//入栈
	StackPush(&ps, 4);		//入栈
	StackPush(&ps, 5);		//入栈
	while (!StackEmpty(&ps))
	{
    
		printf("%d ", StackTop(&ps));
		StackPop(&ps);			//出栈
	}
	printf("\n");
	StackDestroy(&ps);
}
void Test2()
{
    
	Stack ps;				//通过结构体类型创建结构体变量
	StackInit(&ps);			//初始化
	StackPush(&ps, 1);		//入栈
	StackPush(&ps, 2);		//入栈
	StackPush(&ps, 3);		//入栈
	StackPop(&ps);			//出栈
	StackPop(&ps);			//出栈
	printf("元素个数为:%d\n", StackSize(&ps)); 	//获取元素个数
	StackPop(&ps);			//出栈
	printf("元素个数为:%d\n", StackSize(&ps)); 	//获取元素个数

	//为空
// StackPop(&ps); //出栈
// printf("元素个数为:%d\n", StackSize(&ps)); //获取元素个数
	StackDestroy(&ps);
}
int main()
{
    
	Test1();
	Test2();
	return 0;
}

在这里插入图片描述

什么是栈

栈(Stack)是一种数据结构,它类似于一堆叠在一起的盘子,只能从最上面取出盘子,而不能从中间或底部取出。栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,即最后放入栈的元素最先被取出。栈通常有两个操作:push(压栈)和pop(出栈)。push操作会在栈的顶部添加一个元素,而pop操作则会在栈的顶部删除一个元素。

实现步骤

1、初始化——栈

typedef int STDataType;
typedef struct Stack
{
    
	STDataType* _a;
	int _top; // 栈顶
	int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps)
{
    
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}

2、判空——栈

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
    
	return ps->_top == 0;
}

解析:若ps->_top == 0返回true,否则返回false,这里注意下逻辑
assert(!StackEmpty(ps)); 若为0,返回true,!true为false。
为了提高这句代码的可读性,我们才这样写。

3、入栈

// 入栈
void StackPush(Stack* ps, STDataType data)
{
    
	if (ps->_top == ps->_capacity)				//扩容
	{
    
		STDataType newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
		STDataType * tmp = (STDataType * )realloc(ps->_a, newcapacity * sizeof(Stack));
		if (tmp == NULL)			
		{
    
			perror("realloc fail");			//打印错误信息
			return;		//若开辟失败,程序结束
		}
		ps->_capacity = newcapacity;
		ps->_a = tmp;
	}
	 ps->_a[ps->_top] = data;
	 ps->_top++;
}


4、出栈

// 出栈
void StackPop(Stack* ps)
{
    
	assert(ps);
	assert(!StackEmpty(ps));    //判空,为假报错
	ps->_top--;
}

5、获取有效元素个数——栈

// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
    
	assert(ps);
	STDataType size = ps->_top;
	return size;
}

6、销毁——栈

// 销毁栈
void StackDestroy(Stack* ps)
{
    
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}

小结

倘若本文有遗漏疏忽之处,还需要你指正,以便今后改进!祝你天天开心啦!欢迎到我的博客留言,我会尽力解答,希望能给你一些帮助!

. . .

相关推荐

额外说明

java -- Reflection 利用反射来改进工厂设计模式

java的工厂设计模式源自于生活,大家先看一个例子,比较简单,我刚开始了解工厂时看到的简单例子。 interface IFruit { public void eat(); } class Apple implements IFruit { @Ove

额外说明

pandas根据索引删除数据框列

如何根据索引删除dataframe的多个列呢? 核心代码逻辑:  # 要删除的列,注意索引是从0开始的 x = [0, 2, 8, 9, 10, 11, 12] df.drop(df.columns[x], axis=1, inp

额外说明

Docker配置镜像加速器

1.登录阿里云 阿里云-计算,为了无法计算的价值 (aliyun.com) 2.容器 说明:找到产品下的容器 3.容器镜像服务ACR 4.点击控制台   5. 点击镜像加速器 6.操作文档  

额外说明

RabbitMQ的重试队列

1.背景 通过上文学习知道了死信队列,如果只是网络抖动,出现异常那么直接进入死信队列,那么是不合理的。这就可以使用延时重试队列,本文将介绍如何实现延时重试队列。 2.原理 图是俺在网上找的,请原作者谅解。 发送到业务队里 如果正常收到 正常运行 如果处理

额外说明

数学加强 第一节 第十九课

[toc] 指数分布的无记忆性 指数函数的一个重要特征是无记忆性 ( 遗失记忆性, Memoryless Property ).  如果一个随机变量呈指数分布, 当 s,t >=0 时有: 即, 如果 x 是某电器元件的寿命, 已知元件使用了 s 小时,

额外说明

机器学习 第六节 第六课

[toc] 练习三  现在我们有 2015 到 2017 年 25 万条 911 的紧急电话的数据, 请统计出不同月份不同类型紧急电话的次数的变化情况. 执行结果:

额外说明

二战MySQL数据库【升华篇】

MYSQL入门系列——第二篇 每篇前言: 1.筛选条件: (1)比较运算符: (2)逻辑运算符: (3)其他操作: 1.排序: 2.限制: 拓展: 3.去重: 4.模糊查询: (like '%') 5.范围查询: 2.聚合与分组(重点哦!): (1)常用

额外说明

TIDB - 使用BR工具进行数据热备份与恢复

一、BR工具 BR 全称为 Backup & Restore,是 TiDB 分布式备份恢复的命令行工具,用于对 TiDB 集群进行数据备份和恢复。BR 只支持在 TiDB v3.1 及以上版本使用。 在前面的章节中,我们介绍了dumpling将数据导出的

额外说明

Java实训项目9:GUI学生信息管理系统 - 实现步骤 - 创建数据访问接口

文章目录 七、实现步骤 (五)创建数据访问接口 1、创建学校数据访问接口 2、创建状态数据访问接口 3、创建学生数据访问接口 4、创建用户数据访问接口 七、实现步骤 (五)创建数据访问接口 DAO: Data Acess Object 系统有四张表:t_

额外说明

由浅入深理解java集合(二)——集合 Set

一、HashSet类 HashSet简介 HashSet是Set接口的典型实现,实现了Set接口中的所有方法,并没有添加额外的方法,大多数时候使用Set集合时就是使用这个实现类。HashSet按Hash算法来存储集合中的元素。因此具有很好的存取和查找性能

ads via 小工具