数据结构栈的实现

news2024/11/13 8:56:46

目录

  • 栈的概念
  • 栈的结构声明
  • 初始化
  • 数据入栈
  • 出栈
  • 判断栈是否为空
  • 取栈顶的值
  • 销毁栈

栈的概念

栈是一种线性表,插入数据的一端叫栈顶,另一端叫栈底。
入栈:数据从栈顶进入栈中
出栈:数据从栈顶删除
所以,栈的特点就是先进后出,也可以说后进先出。

入栈图
在这里插入图片描述
出栈图
在这里插入图片描述
根据栈先进后出的性质,我们来实现一个简单的栈。

栈的结构声明

typedef int STDataType;

struct Stack
{
	//存放数据的空间
	STDataType* data;
	//栈顶位置
	size_t top;
	//栈的容量
	size_t Cacpcity;
}ST;

初始化

初始化很简单,我们让data指向的空间为NULL,顶部位置从0开始,每插入一个数据就+1。

//初始化
void StackInto(ST* ST)
{
	ST->data = NULL;
	ST->top = 0;
	ST->Cacpcity = 0;
}

在这里插入图片描述
我们可以看到初始化成功了。

数据入栈

栈初始化好后,我们就要把数据插入栈中,因为是先进后出,所以我们直接在数组尾部插入即可。
在这里插入图片描述


//容量更新
void CheckCacpcity(ST* ST)
{
	//容量等于top时,说明数组没有空间了
	if (ST->Cacpcity == ST->top)
	{
		//如果空间为0,初始空间4,如果不为0,空间*2
		int NewCacpcity = ST->Cacpcity == 0 ? 4 : ST->Cacpcity * 2;
		//扩容
		STDataType* newdata = (STDataType*)realloc(ST->data,sizeof(STDataType) * NewCacpcity);
		//扩容是否成功
		if (newdata == NULL)
		{
			printf("reallo fail\n");
			exit(-1);
		}
		ST->data = newdata;
		//更新容量
		ST->Cacpcity = NewCacpcity;
	}
}

//数据入栈
void StackPush(ST* ST, STDataType x)
{
	//断言,传进来的指针不能为空
	assert(ST);
	//容量不够自动增容
	CheckCacpcity(ST);

	//尾部数据入栈
	*(ST->data+ST->top) = x;
	ST->top++;
}

在这里插入图片描述

然后我们发现数据入栈。并且容量更新了。

出栈

因为栈是后进来的先出去,所以直接删除最后一个元素即可。
在这里插入图片描述

//数据出栈
void StackPop(ST* ST)
{
	assert(ST);
	//如果top等于0,说明没有元素了
	assert(ST->top > 0);

	//出栈操作,就是这么简单
	ST->top--;

}

判断栈是否为空

直接判断top的值是否为0即可,返回真即为空。


//栈是否为空
bool StackEmpty(ST* ST)
{
	assert(ST);
	return ST->top == 0;
}

取栈顶的值

同样很简单,top-1的值就是栈顶的值,但是要注意栈必须不为空。

//取栈顶的值
STDataType StackTop(ST* ST)
{
	assert(ST);
	assert(!StackEmpty(ST));
	return ST->data[ST->top - 1];
}

入栈的顺序是1 2 3 4 5 ,出栈的顺序是 5 4 3 2 1
在这里插入图片描述

销毁栈

这个也简单,top和capacity置为0,释放掉data,指针置为空即可。

//销毁
void StackDestroy(ST* ST)
{
	assert(ST);
	ST->top = ST->Cacpcity = 0;
	free(ST->data);
	ST->data = NULL;
}

在这里插入图片描述
销毁成功。
代码已上传至git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark - OnYARN 模式搭建,并使用 Scala、Java、Python 三种语言测试

一、SparkOnYarn搭建 安装前需要提前安装好 hadoop 环境,关于 HDFS 和 Yarn 集群的搭建可以参考下面我的博客: https://blog.csdn.net/qq_43692950/article/details/127158935 下面是我 Hadoop 的安装结构 主机规划设置主机名角色192.168.40.172node1N…

1. STL六大组件

0. 介绍 STL提供六大组件,它们之间可以彼此套用,如下图所示: 容器(containers):用于存放数据; 算法(algorithms):包含各种常用算法; 迭代器&…

Dubbo-RPC核心接口介绍

前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrapper 注册中心 Dubbo-聊聊注册中心的设计 Dubbo-时间轮设计 通信 Dubbo-聊聊通信模块设计 RPC 聊聊Dubbo协议 …

go语言日志实现详解(打印日志、日志写入文件和日志切割)

log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(P…

[附源码]计算机毕业设计JAVA医院挂号管理系统

[附源码]计算机毕业设计JAVA医院挂号管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

简单的咖啡文化静态HTML网页设计作品 DIV布局咖啡馆文化网页模板代码 DW咖啡网站制作成品

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

达梦安装目录各个文件夹解析

达梦安装目录各个文件夹解析 总览: 1、bin目录 bin目录:存放常用命令和.so(shared object)文件(动态链接库类似Windows的ddl文件、Linux的lib目录) 2、bin2目录 bin2目录:存放utf8的lib库 3、data目录 data目录&#…

LeetCode 744. 寻找比目标字母大的最小字母

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 744. 寻找比目标字母大的最小字母 ,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名…

Centos7 内核升级(5.4.225)

文章目录一、背景二、在线 yum 安装1)查看当前内核版本信息2)导入仓库源3)选择 ML 或 LT 版本安装4)设置启动5)生成 grub 配置文件6)重启7)验证是否升级成功8)删除旧内核&#xff08…

【应用】布隆过滤器

布隆过滤器布隆过滤器简介及使用场景布隆过滤器底层原理数据添加数据查询布隆过滤器的优缺点Redis 整合布隆过滤器Java 整合布隆过滤器SpringBoot 整合 Redis 使用布隆过滤器布隆过滤器简介及使用场景 布隆过滤器实际上是一列很长的二进制数组,在每个位置上只有 0 …

CommonsCollections4利用链分析

目录 前言: 0x01 代码分析 总结一下利用链: POC: 完整的POC: 图 1-1 cc利用链前言: CC4这条链用到了新的Commons-Collections4这个依赖,由于这个依赖与之前的版本具有较大的出入,连groupId和artifactId…

Android 基础知识4-2.1常用控件文本框(TextView)

TextView就是用来显示文本标签的控件&#xff0c;修改使用TextView显示文本的颜色、大小等属性。 实例代码&#xff1a; xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.co…

有源晶振与无源晶振的区别

今天就来和大家分享下有源晶振和无源晶振的区别。 1.从外形上有源大部分有源晶振是这种四脚贴片的&#xff0c;差分有源晶振的话一般是6脚的&#xff0c;当然还有其它的一些封装 而无源晶振的有两脚插件的也有和有源晶振一样的这种四脚贴片的 2.无源晶振不需要额外供电&#x…

.移动端适配的解决方案

何为移动端适配 移动端适配就是值在不同的移动端 可以去讲我们的内容适应不同屏幕尺寸大小 我们之前写单位用的是px这个单位 但是这是一个写死的单位 rem 所以我们用一个可变的单位 rem &#xff08;是指用html字体大小作为单位 比如说我们设置html字体大小为16px 那么 …

[附源码]计算机毕业设计基于springboot的残障人士社交平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

一篇文章了解MySQL的group by

准备工作&#xff01; 1.本文章MySQL使用的是5.7&#xff0c;引擎使用的是innodb 2. 使用的表结构&#xff08;t1&#xff09;&#xff0c;字段a上有一个索引&#xff0c; 1. group by常用方法&#xff1a; group by的常规用法是配合聚合函数&#xff0c;利用分组信息进行统…

公众号网课查题接口使用方法

公众号网课查题接口使用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&…

用Hopper修改代理软件端口

背景 用代理软件可以访问google&#xff0c;但是端口经常不固定&#xff0c;从缺省1080变成了随机。 前几天其实已经用Hopper 3.0看了一次&#xff0c;但是好像不支持go&#xff0c;所以没反编译成功&#xff0c;这次换了4.0&#xff0c;支持了go。 Hopper与逆向 逆向的目的…

7.7 网络(二)

接上篇&#xff1a;7.7 网络&#xff08;一&#xff09;_龙赤子的博客-CSDN博客 目录 三 操作系统涉及的网络内容 1 网络栈 2 协议 3 应用 三 操作系统涉及的网络内容 1 网络栈 这里我们重点讨论操作系统里面的网络。这部分在整个网络架构中&#xff0c;属于端的技术。对于端来…

Spring - ApplicationContextAwareProcessor扩展接口

文章目录Preorg.springframework.context.support.ApplicationContextAwareProcessor内部的7个扩展点源码解析扩展示例Pre Spring Boot - 扩展接口一览 org.springframework.context.support.ApplicationContextAwareProcessor /** Copyright 2002-2020 the original author …