【数据结构】--栈

news2024/10/7 8:31:50

👌个人主页: 起名字真南
🤣个人专栏:【数据结构初阶】 【C语言】

请添加图片描述

目录

  • 1 栈
    • 1.1 栈的概念和结构
    • 1.2 栈的实现
      • 1.2.1 头文件
      • 1.2.2 初始化
      • 1.2.3 销毁
      • 1.2.4 打印所有元素
      • 1.2.5 入栈
      • 1.2.6 出栈
      • 1.2.7 获取栈顶数据
      • 1.2.8 判空
      • 1.2.9 获取元素个数

1 栈

1.1 栈的概念和结构

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

压栈:栈的插入操作叫做压栈/ 进栈。
出栈:栈的删除操作叫做出栈。
不管是压栈还是出栈都在栈顶

在这里插入图片描述

1.2 栈的实现

栈的实现一般可以用数组或者链表进行实现,但相对而言使用数组的结构实现更优越些,因为数组在尾插数据比较方便。

1.2.1 头文件

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int StackDataType;

typedef struct Stack
{
	StackDataType* arr;  
	int top;  //记录栈顶的数据
	int capacity; //记录空间的大小

}Stack;

//初始化
void StackInit(Stack* ST);

//销毁
void StackDestroy(Stack* ST);

//打印数据
void StackPrint(Stack ST);

//插入数据
void StackPush(Stack* ST, StackDataType data);

//删除数据
void StackPop(Stack* ST, StackDataType data);

//取栈顶数据
StackDataType StackTop(Stack* ST);

//判空
bool StackEmpty(Stack* ST);

//获取数据个数
int STSize(Stack* pst);

1.2.2 初始化

我们可以看到栈的初始化和顺序表的初始化基本一致。所以这次我们在初始化的时候给定capacity = 4,因为初始有空间所以在给数组初始化的时候要开辟空间,使用malloc,然后定义top来记录栈顶的数据。


void StackInit(Stack* ST)
{
	assert(ST);
	ST->arr = (StackDataType*)malloc(4 * sizeof(StackDataType));
	ST->capacity = 4;
	ST->top = 0;
}

1.2.3 销毁

因为数组是一串连续的空间所以直接释放首元素地址即可。

void StackDestroy(Stack* ST)
{
	free(ST->arr);
	ST->arr = NULL;
	ST->capacity = ST->top = 0;
}

1.2.4 打印所有元素

因为通过top来记录栈顶元素的原理是top作为访问栈顶元素的指针(地址)所以我们也可以根基top的大小来记录元素的数量。因为这里传的参数是结构体所以结构体的调用使用 ”.“

void StackPrint(Stack ST)
{
	assert(ST.arr);
	for (int i = 0; i < ST.top; i++)
	{
		printf("%d ", ST.arr[i]);
	}
	printf("\n");
}

1.2.5 入栈

入栈我们首先要判断空间的大小是否满了,因为top也记录着元素的数量所以直接比较即可由于在初始化的时候我们分配的空间,所以如果相等的化只有一种情况就是满了,所以我们需要对他进行扩容。

void StackPush(Stack* ST, StackDataType data)
{
	assert(ST);
	if (ST->top == ST->capacity)
	{
		StackDataType* tmp = realloc(ST->arr, 2 * sizeof(ST->arr));
		if (tmp == NULL)
		{
			perror("realloc:");
		}
		ST->arr = tmp;
		ST->capacity = 2 * (ST->capacity);
	}
	ST->arr[ST->top++] = data;
	ST->capacity++;
}

1.2.6 出栈

出栈和顺序表的尾删同理。

void StackPop(Stack* ST, StackDataType data)
{
	assert(ST);
	ST->top--;
}

1.2.7 获取栈顶数据

需要注意的是在构造函数的时候,函数的返回值类型,还有top-1记录的是栈顶的数据而top记录的是元素的个数,因为是从0开始所以相差了1.

StackDataType StackTop(Stack* ST)
{
	assert(ST);
	return ST->arr[ST->top - 1];
}

1.2.8 判空

判空的时候我们需要用到bool类型所以需要包含对应的头文件,如果ST->top == 0 成立则返回 True 否则返回False。

#include<stdbool.h>
bool StackEmpty(Stack* ST)
{
	assert(ST->arr);
	return ST->top == 0;
}

1.2.9 获取元素个数

这个也只是需要注意返回值类型为int

int STSize(Stack* pst)
{
	assert(pst);

	return pst->top;
}

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

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

相关文章

Element-UI 并排显示多个 disabled按钮的时候, 不生效问题解决

目录 Element-UI 并排显示多个 disabled按钮的时候&#xff0c; 不生效问题解决 解决方法&#xff1a; 运行结果&#xff1a; Element-UI 并排显示多个 disabled按钮的时候&#xff0c; 不生效问题解决 解决方法&#xff1a; Element-UI 并排显示多个 disabled按钮的时候&a…

测绘局内外网文件导入导出,怎样才能效率安全两手抓?

测绘局负责进行各种基础测绘工作&#xff0c;如地形测量、地籍测绘、海洋测绘等&#xff0c;获取并更新国家基础地理信息数据。这些数据是国民经济建设、城市规划、资源调查、环境保护等各个领域的重要基础资料。对于维护国家地理信息安全、促进国民经济和社会发展具有重要意义…

空间转录组学联合单细胞转录组学揭示卵巢癌生存相关受配体对

卵巢癌&#xff0c;作为女性生殖系统中的一种常见恶性肿瘤&#xff0c;其高级别浆液性卵巢癌&#xff08;HGSC&#xff09;亚型尤其致命。尽管多数患者对初次治疗反应良好&#xff0c;但超过75%的晚期HGSC患者会在治疗后复发&#xff0c;并且对化疗药物产生耐药性。然而&#x…

QT+winodow 代码适配调试总结(二)

已经好多年了&#xff0c; linux环境下不同版本的QT程序开发和部署&#xff0c;突然需要适配window环境程序调试&#xff0c;一堆大坑&#xff0c;还真是一个艰巨的任务&#xff0c;可是kpi下的任务计划&#xff0c;开始吧&#xff01;&#xff01; 1、首先我们自定义的动态库…

Python应用开发——30天学习Streamlit Python包进行APP的构建(10)

st.map 显示一张叠加了散点图的地图。 它是 st.pydeck_chart 的包装器&#xff0c;用于在地图上快速创建散点图表&#xff0c;并具有自动居中和自动缩放功能。 使用该命令时&#xff0c;Mapbox 会提供地图瓦片来渲染地图内容。请注意&#xff0c;Mapbox 是第三方产品&#x…

品牌窜货治理:维护市场秩序与品牌健康的关键

品牌在各个渠道通常都会设定相应的销售规则&#xff0c;其中常见的便是区域保护制度&#xff0c;比如 A 地区的货物只能在 A 地区销售&#xff0c;各区域的产品价格和销售策略均有所不同&#xff0c;因此 A 地区的货物不能流向 B 地区&#xff0c;否则就被称为窜货。 窜货现象不…

【PHP】控制摄像头缩放监控画面大小,并保存可视画面为图片

一、前言 功能描述 调用摄像头并可以控制缩放摄像头监控画面的大小&#xff0c;把可视画面保存为图片。 我使用的是USB摄像头&#xff0c;其他摄像头此方法应该也通用。 使用技术 使用到的技术比较简单&#xff0c;前端使用WebcamJS插件调用摄像头&#xff0c;并摄像头监控…

初识前端工程化

前端工程化 一、接口文档管理 YAPI二、前端工程化1、前端工程化介绍2、环境准备 三、Vue 项目创建&简介1、Vue 项目创建2、Vue 项目简介3、运行 Vue 项目 四、Vue 组件库 Element UI1、Elment UI 简介2、Element UI 入门 五、Vue 项目中使用 axios六、Vue 路由1、Vue 路由简…

一种基于优化信息频带的旋转机械故障诊断方法(MATLAB)

特征提取是滚动轴承故障诊断及状态监测的关键&#xff0c;直接关系到轴承状态预示及故障识别的准确性&#xff0c;也是轴承故障诊断中的研究热点。考虑到轴承故障冲击会导致振动信号的形态改变&#xff0c;进而引起相关统计参数的变化&#xff0c;所以通过振动信号计算的统计量…

上海高考志愿填报小程序开发的主要功能

6月毕业季&#xff0c;高考学子刚经历了激烈的高考角逐&#xff0c;又迎来了志愿填报的大关。面对影响一生的高考志愿&#xff0c;如何填报显得尤为重要&#xff0c;面对广大学子的填报需求&#xff0c;上海高考志愿填报小程序为高考学子带来了福音。 一&#xff0e; 上海高考…

低空经济:新蓝海的启航与eVTOL动力系统测试的前瞻探索

引言&#xff1a;低空经济的新时代篇章 ​在2023年的全国两会上&#xff0c;“低空经济”首次跃然于政府工作报告之中&#xff0c;标志着这一新兴产业正式步入国家发展战略的核心舞台。工业和信息化部、科学技术部、财政部与中国民用航空局联合发布的《通用航空装备创新应用实…

小区物业管理收费系统源码小程序

便捷、透明、智能化的新体验 一款基于FastAdminUniApp开发的一款物业收费管理小程序。包含房产管理、收费标准、家属管理、抄表管理、在线缴费、业主公告、统计报表、业主投票、可视化大屏等功能。为物业量身打造的小区收费管理系统&#xff0c;贴合物业工作场景&#xff0c;轻…

【微前端-Single-SPA、qiankun的基本原理和使用】

背景 在实际项目中&#xff0c;随着日常跌倒导致的必然墒增&#xff0c;项目会越来越冗余不好维护&#xff0c;而且有时候一个项目会使用的其他团队的功能&#xff0c;这种跨团队不好维护和管理等等问题&#xff0c;所以基于解决这些问题&#xff0c;出现了微前端的解决方案。…

FFmpeg教程-二-代码实现录音

目录 一&#xff0c;实现步骤 二&#xff0c;具体实现 1&#xff0c;注册设备 2&#xff0c;获取输入格式对象 3&#xff0c;打开设备 4&#xff0c;采集数据 一&#xff0c;实现步骤 二&#xff0c;具体实现 1&#xff0c;注册设备 // 初始化libavdevice并注册所有输入…

Java版本Spring Cloud+SpringBoot b2b2c:Java商城实现一件代发设置及多商家直播带货商城搭建

一、产品简介 我们的JAVA版多商家入驻直播带货商城系统是一款全*面的电子商务平台&#xff0c;它允许商家和消费者在一个集成的环境中进行互动。系统采用先进的JAVA语言开发&#xff0c;提供多商家入驻、直播带货、B2B2C等多种功能&#xff0c;帮助用户实现线上线下的无缝对接…

M Farm RPG Assets Pack(农场RPG资源包)

🌟塞尔达的开场动画:风鱼之歌风格!🌟 像素参考:20*20 字体和声音不包括在内 资产包括: 1名身体部位分离的玩家和4个方向动画: 闲逛|散步|跑步|持有物品|使用工具|拉起|浇水 6个带有4个方向动画的工具 斧头|镐|喙|锄头|水壶|篮子 4个NPC,有4个方向动画: 闲逛|散步 �…

理解IP地址与域名:访问网站的基石

在互联网的世界里&#xff0c;每一次点击、每一次浏览都伴随着一个神秘的数字串——IP地址&#xff0c;以及一个易于记忆的字符串——域名。对于普通用户而言&#xff0c;这两者可能只是浏览网页时的“幕后英雄”&#xff0c;但实际上&#xff0c;它们构成了我们访问网站的基石…

人工神经网络是什么,其应用有哪些?

人工神经网络是什么&#xff0c;其应用有哪些&#xff1f; 当你阅读这篇文章时&#xff0c;你身体的哪个器官正在考虑它&#xff1f;当然是大脑&#xff01;但是你知道大脑是如何工作的吗&#xff1f;嗯&#xff0c;它有神经元或神经细胞&#xff0c;它们是大脑和神经系统的主要…

STM32HAL库 -- RS485 开发板通信(速记版)

在本章中&#xff0c; 我们将使用 STM32F429的串口 2 来实现两块开发板之间的 485 通信(半双工)。 RS485 简介 485&#xff08;一般称作 RS485/EIA-485&#xff09;隶属于 OSI 模型物理层&#xff0c;是串行通讯的一种。电气特性规定为 2 线&#xff0c;半双工&#xff0c;多…

java-数据结构与算法-02-数据结构-02-链表

文章目录 1. 概述2. 单向链表3. 单向链表&#xff08;带哨兵&#xff09;4. 双向链表&#xff08;带哨兵&#xff09;5. 环形链表&#xff08;带哨兵&#xff09;6. 习题E01. 反转单向链表-Leetcode 206E02. 根据值删除节点-Leetcode 203E03. 两数相加-Leetcode 2E04. 删除倒数…