栈的基本操作(C语言实现)创建,销毁,入栈,出栈

前言

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

一、栈(Stack)的基本量建立

typedef int STDataType;//栈的数据类型

typedef struct stack {
	STDataType* a;//栈存放的位置
	int top;//用来标记栈顶
	int capacity;//栈的容量
}ST;//把基本量封装成一个结构体

二、栈的基本操作

在这里插入图片描述

2.1栈的初始化(STInit)

void STInit(ST* ps) {
	assert(ps);//栈可以为空,但是存放栈相关基本量的结构体不能为空
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	//初始栈的大小为4
	if (NULL == ps->a) {
		perror("Init error");
		return;
	}//判断是否为有效空间
	ps->top = 0;//top从0开始,
	//top在目前栈顶元素的下一个位置,没存放数据
	ps->capacity = 4;//初始容量
}

2.2入栈(STPush)

在这里插入图片描述

void STPush(ST* ps,STDataType x) {
	assert(ps);
	if (ps->capacity == ps->top) {
		STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity * 2);
		//判断当前容量是否支持入栈,不够则进行扩容
		if (tmp == NULL) {
			perror("STPush error");
			return;
		}
		ps->a = tmp;//a指向新开辟的空间
		ps->capacity *= 2;//新空间容量为原来二倍
	}
	ps->a[ps->top] = x;//在当前top指向插入x
	ps->top++;//top后移一个位置
}

2.25判断是否为空(STEmpty)

bool STEmpty(ST* ps) {
	assert(ps);
	return ps->top == 0;
	//因为top指向最后一个数据的后一个位置,所以top
	//为0,说明前面没有元素
}

2.3获取栈顶元素(STTop)

STDataType STTop(ST* ps) {
	assert(ps);
	assert(!STEmpty(ps));
	//判断是否为空,为空则不能读取栈顶元素
	return ps->a[ps->top - 1];
	//因为top指向最后一个数据的后一个位置,
	//top下标的位置为空,所以要向前一位
}

2.4出栈(STPop)

void STPop(ST* ps) {
	assert(ps);
	assert(!STEmpty(ps));
	//判断是否为空,为空则不能出栈
	ps->top--;
	//这里出栈并不是真正意义上的销毁数据,
	//而是让top前移一个位置
	//而我们不会访问top下标及其以后的位置,所以
	//达到了类似消除的效果
	//当top为0就代表出栈了全部数据
}

2.5栈的大小(STSize)

int STSize(ST* ps) {
	assert(ps);
	return ps->top ;
	//数组是从0开始的,而top的位置在最后一个数据
	//后一个位置,所以top就是栈中数据数量
}

2.6栈的销毁(STDestroy)

void STDestroy(ST* ps){
	assert(ps);
	free(ps->a);
	//释放空间
	ps->a = NULL;
	//别忘了置空
	ps->top = 0;
	ps->capacity = 0;
}

总结

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

同样是测试,朋友到了30k,我才12K,这份测试面试8股文确实牛

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而,小编要说的是,不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿,薪资的差别还是很大的。 众所周知,目前互联网行业是众多行业中薪资待遇最好的,…

Fedora 38 正式发布

Fedora Linux 38 正式发布,用户可以访问官网下载安装最新版本。 新网站 如果你点击了上面的官网链接,你应该会注意到 Fedora 的官网看起来与之前有了很大不同。这是 Fedora Websites & Apps 团队与 Design & Infrastructure 团队以及广大社区合作…

【视频课程】算法工程师需要的ChatGPT大模型算法理论与实践课程!非粗浅科普...

前言 自从2022年11月ChatGPT发布之后,迅速火遍全球。其对话的交互方式,能够回答问题,承认错误,拒绝不适当的请求,高质量的回答,极度贴近人的思维的交流方式,让大家直呼上瘾,更是带火…

安装配置SVN版本控制管理工具

SVN工具能帮我们做什么? 核心功能:文档版本管理系统 适合对象:个人与团队都可以使用,企业中项目资源的重要管理工具 举例:一个文件夹里面的文档管理 1.下载安装SVN服务器 VisualSVN-Server 2.下载安装SVN客户端 T…

<网络编程>网络套接字

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的关系 理解源端口号和目的端口号 初步认识TCP、UDP协议 TCP协议 UDP协议 网络字节序列 socket网络接口 socket常见API sockaddr结构 UDPsocket 编码: 理解源IP地址和目的IP地址 源IP&#xf…

Jupyter Notebook的安装与使用

Jupyter Notebook Jupyter Notebook介绍Jupyter Notebook使用安装启动创建文件编写代码和文本常用命令配置文件 Anaconda Jupyter Notebook介绍 Jupyter Notebook是一个基于Web的交互式计算环境,可以让用户以文档形式记录代码、数据分析结果和说明文本,并…

从零开始的ChatGLM 配置详细教程

从零开始的ChatGLM配置教程 文章目录 从零开始的ChatGLM配置教程一,前言二,环境配置1、下载ChatGLM项目2、配置程序运行环境 三、在HuggingFace下载chatGLM-6B模型1,安装 Git Lfs2,下载相关文件3,在HuggingFace中下载相…

一致性 Hash 算法 及Java TreeMap 实现

1、一致性 Hash 算法原理 一致性 Hash 算法通过构建环状的 Hash 空间替线性 Hash 空间的方法解决了这个问题,整个 Hash 空间被构建成一个首位相接的环。 其具体的构造过程为: 先构造一个长度为 2^32 的一致性 Hash 环计算每个缓存服务器的 Hash 值&…

基于Java+Spring+vue+element实现旅游信息管理平台系统

基于JavaSpringvueelement实现旅游信息管理平台系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…

抢先看,甘特图工具DHTMLX gantt 灯箱编辑器通过套件 UI 小部件进行了扩展

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…

为什么重写equals时必须重写hashCode()

不重写equals和不重写 hashCode()之前:equals()比较的是对象的内存地址,hashCode()比较的其实也是内存地址(内存地址输入到哈希函数中得到的整数) 重写了之后,equals()比较的是对象的内容值,如果hashCode()不重写,还是…

Android硬件通信之 WIFI通信

一,简介 1.1 随着网络的普及和通信技术的发展,网络的传输速度也越来越快,wifi技术也还成为手机设备最基本的配置。我们可以通过wifi实现手机与手机之前的信息传输,当然也可以与任意一台有wifi模块的其它设备传输。 1.2 wifi与蓝…

【数据库多表操作】sql语句基础及进阶

常用数据库: 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它是长期存储在计算机内、有组织、有结构的数据集合。数据库是信息系统的核心部分,现代软件系统中大量采用了数据库管理系统(DBM…

黑马在线教育数仓实战7

1. hive的相关的优化 1.1 hive的相关的函数(补充说明) if函数: 作用: 用于进行逻辑判断操作语法: if(条件, true返回信息,false返回信息) 注意: if函数支持嵌套使用 nvl函数: 作用: null值替换函数格式: nvl(T value, T default_value) COALESCE函数 作用: 非空查找函数:格式…

Node【Express框架【二】】

文章目录 🌟前言🌟中间件🌟中间件函数🌟什么是中间件函数🌟中间件函数可以做什么 🌟Express中间件的类型🌟应用级中间件🌟路由器级中间件🌟错误处理中间件🌟内…

华为OD机试真题(Java),计算最大乘积(100%通过+复盘思路)

一、题目描述 给定一个元素类型为小写字符串的数组&#xff0c;请计算两个没有相同字符的元素长度乘积的最大值&#xff0c; 如果没有符合条件的两个元素&#xff0c;返回0。 二、输入描述 输入为一个半角逗号分隔的小写字符串的数组&#xff0c;2 < 数组长度<100&am…

设计模式 --- 概述

一、设计模式概述 1.1、软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任 克里斯托夫亚历山大 &#xff08;Christopher Alexander&…

机器学习算法 决策树

文章目录 一、决策树的原理二、决策树的构建2.1 ID3算法构建决策树2.2 C4.5 算法树的构建2.3 CART 树的创建 三、决策树的优缺点 一、决策树的原理 决策树&#xff08;Decision Tree&#xff09;是一种非参数的有监督学习方法&#xff0c;它能够从一系列有特征和标签的数据中总…

项目五:使用路由器构建园区网

使用路由器构建园区网 1、新建拓扑2、配置交换机与主机3、配置路由交换机并进行通信4、通信测试5、配置路由器并进行通信测试1、配置路由器R-12、配置路由器R-2、R-33、通信测试 1、新建拓扑 依次添加四台主机&#xff0c;两台交换机&#xff0c;型号为S3700。两台路由交换机&…

归排、计排深度理解

归并排序&#xff1a;是创建在归并操作上的一种有效的排序算法。算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用&#xff0c;且各层分治递归可以同时进行。归并排序思路简单&#xff0c;速度仅次于快速排序&#xff0c;为稳定排序算法&#…