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

news2024/12/24 8:11:13

前言

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出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;
}

总结

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

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

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

相关文章

Linux网络编程服务端的创建

文章目录 前言一、编程前的准备1.相关函数的了解二、accept函数特别注意点三、具体函数的实现四、运行客户端和服务端进行通信验证总结前言 上篇文章讲解了如何创建一个客户端,这篇文章将创建一个服务端用来和上篇文章的客户端进行通信。 一、编程前的准备 1.相关函数的了解…

服务(第九篇)tomcat的部署和优化

tomcat的介绍: 免费的、开放源代码的Web应用服务器(用java开发的) Apache软件基金会(Apache Software Foundation)Jakarta项目中的一个核心项目 由Apache、Sun和一些公司及个人共同开发而成 深受Java爱好者的喜爱,并得到部分软…

干货|实验操作难入门?快来看JoVE视频网站!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 当导师要求我们学习、模仿一些学术大神所做的心理学实验,尤其是采用脑影像、脑电技术等高端仪器的实验时,我们往往会因为缺少对具体操作细节的了解而感到困惑或困难。…

【python视图2】基于networkx的10个绘图技巧

一、说明 networkx在02年5月产生,是用python语言编写的软件包,便于用户对复杂网络进行创建、操作和学习。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络…

MIPI摄像头工程=7系列FPGA + OV5640(MIPI) + 15 分钟 + VITIS

项目使用东西 硬件 Spartan-7 SP701 FPGA 7系列FPGA电阻网络实现的MIPI接口 OV5640 MIPI接口 软件 AMD Vivado 2020 版本以上 AMD Vitis 2020 介绍 MIPI 接口现在非常流行,国产FPGA目前基本都带MIPI接口,而AMD-Xilinx是从U系列开始支持MIPI电平&#x…

使用CMake的CPack工具打包项目

为了介绍如何使用CMake的CPack工具进行项目打包,这里使用了前文CMake项目使用ctestgtest进行单元测试中的示例。 为了更接近实际开发中项目的情况,自行下载gtest并进行源码编译来模拟实际项目中的依赖项;在实际的开发中,可能会有…

chatgpt智能提效职场办公-ppt怎么压缩文件大小

作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 压缩PPT文件大小有以下几种方法: 压缩图片大小:在PPT当中,图片是占用存储空间最大的部分&#xff0…

物联网多协议、多场景自定义测试|XMeter Cloud 更新

近日,全球首个物联网 MQTT 负载测试云服务 XMeter Cloud 推出了自定义场景测试功能。 该功能将满足用户自主定义测试场景和测试更广泛协议的需求,实现对除 MQTT 以外的 TCP、WebSocket、HTTP 等其他网络协议的测试,帮助用户构建更复杂的测试…

mybatis模糊查询以及结果封装详解

mybatis模糊查询以及结果封装详解 创建maven项目&#xff1a;项目结构如图所示 准备数据库表&#xff1a; 准备pom.xml所需的依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0…

程序地址空间(下)

目录 &#xff1a; 1.接上部分内容再谈谈地址空间是什么&#xff1f;&#xff1f; 2.页表MMU&#xff08;硬件设备&#xff09; 3.为什么要搞个虚拟地址映射到物理地址 4.解释为什么最开始的问题&#xff1f;&#xff1f;&#xff1f; ---------------------------------------…

Spring 的 IoC(控制反转)

IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;也是一个概念&#xff0c;同时是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 在这里说 IoC 之…

Java ---包装类

&#xff08;一&#xff09;包装类概念 官方说法&#xff1a; Java是面向对象的语言&#xff0c;但是为了便于开发者的使用&#xff0c;Java中却沿用了C语言的基本数据类型&#xff0c;在进行基本的数据计算时&#xff0c;开发者可以直接使用基础类。但是当需要和Java其他对象…

如何理解ThreadLocal

ThreadLocal的基本概念 在并发编程中&#xff0c;多个线程访问同一个变量&#xff0c;可能会出现线程安全问题、为了保证在多线程环境下访问共享变量的安全性&#xff0c;通常在访问共享变量的时候加锁&#xff0c;以实现线程同步的效果。 使用同步锁机制保证多线程访问共享变…

ChatGPT | 一文详解ChatGPT(学习必备)

本文概要 本篇文章主要介绍ChatGPT的产生和使用体验&#xff0c;适合不了解ChatGPT或者了解不够透彻的小伙伴&#xff0c;文中的描述非常详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; &#x1f31f;个人简介 ☀️大家好&#xff01;我是新人…

信息的相关性和冗余度:信息在整个文明中的作用

文章目录 I 古埃及的象形文字1.1 罗塞塔石碑1.2 古埃及文字音节和希腊字母的对应表1.3 破解古埃及文字 I 古埃及的象形文字 1.1 罗塞塔石碑 这个石碑是在公元前196年埃及国王托勒密五世加冕一周年的诏书。 在此前大约一百年&#xff0c;埃及已经被来自希腊北方城邦的亚历山大…

C++------引用

一、 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 类型& 引用变量名(对象名) 引用实体&#xff1b; int main() {//一个变量可以有多个引用…

LWIP协议与TCP/IP

1. 学习一个东西&#xff0c;先了解这个东西是干什么用的&#xff0c;哪些场景会用到它&#xff0c;与自己已经掌握的其他知识的联系 a. 例如&#xff1a;LWIP这个东西是干什么用的&#xff1a;他就是一个裁剪后保持大部分TCP/IP功能的协议。用少量的资源消耗实现一个较为完整的…

大数据实战 --- 淘宝用户行为数据分析

目录 开发环境 数据描述 功能需求 数据准备 数据清洗 用户行为分析 找出有价值的用户 开发环境 HadoopHiveSparkHBase 启动Hadoop&#xff1a;start-all.sh 启动zookeeper&#xff1a;zkServer.sh start 启动Hive&#xff1a; nohup hiveserver2 1>/dev/null 2>…

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

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

什么是隔离放大器

隔离放大器&#xff08;也称为单位增益放大器&#xff09;是一种提供隔离的运算放大器电路电路的一部分与另一部分电路不同&#xff0c;这样就不会在电路的一部分中使用、消耗或浪费功率。 现在将对此进行彻底解释&#xff0c;因为这乍一看似乎是一个令人生畏的话题&#xff0c…