数据结构之线性表(4)

前面我们了解到线性表中的顺序表、链表等结构,今天我们探讨新的一种线性表——
那么我们开始栈的探讨之旅吧。

1.栈的基本概念

1.1栈(Stack):

是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
在这里插入图片描述

1.2栈的特点:

因为栈只能在栈顶进行操作,所以栈的特点是先进后出(FILO)

2.栈的实现

对栈的实现,有多种实现的方法
1.顺序栈

  • 静态顺序栈
#define MAX_SIZE 100
typedef struct StackNods
{
	datatype data[MAX_SIZE];
	size_t top;
	size_t capacity;
}ST;

缺点:存储空间有限,多了浪费空间,少了不够用

  • 动态顺序栈
typedef struct StackNods
{
	datatype *array;
	size_t top;
	size_t capacity;
}ST;

2.链栈

typedef struct StackNods
{
	datatype data;
	struct StackNods* next;
}ST;

缺点:需要浪费空间存储下一个结点的指针(地址)

综合三种结构,我们采用顺序中的动态栈来完成栈的相关操作:

2.1 栈的初始化

在对栈的初始化之前,有两种情况
top初始化为0的情况
在这里插入图片描述

top初始化为-1的情况
在这里插入图片描述
我们从top初始化为0探讨栈的相关操作

//栈的初始化
void Stackinit(ST *pt)
{
	assert(pt);
	pt->array = (datatype*)malloc(sizeof(datatype) * 4);
	if (pt->array == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	pt->capacity = 4;
	pt->top = 0;
}

2.2压栈

//压栈
void StackPush(ST* pt,datatype x)
{
	assert(pt);
	ST* tmp=NULL;
	if (pt->top == pt->capacity)//表示栈满了 -》扩容
	{
		tmp = (datatype*)realloc(pt->array, pt->capacity * sizeof(datatype) * 2);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			pt->array = tmp;
			pt->capacity*=2;//容量变成两倍
		}
	}
	pt->array[pt->top] = x;
	pt->top++;
}

2.3出栈

void StackPop(ST* pt)
{
	assert(pt);//栈空了,调用top,直接种植程序报错
	assert(pt->top > 0);
	pt->top--;
}

2.4取栈顶元素

//取栈顶元素
datatype StackTop(ST* pt)
{
	assert(pt);
	assert(pt->top > 0);
	return pt->array[pt->top - 1];
}

2.5求栈内元素个数

//求栈内元素个数
int StackSize(ST* pt)
{
	assert(pt);
	return pt->top;
}

2.6判栈空

//判栈空
bool StackEmpty(ST* pt)//用布尔类型判断
{
	assert(pt);
	return pt->top == 0;
}

2.7栈打印

//打印
void StackPrintf(ST pt)//打印时不需要对站内元素进行修改,所以不需要传指针
{
	while (pt.top)
	{
		printf("%d ", pt.array[pt.top - 1]);
		StackPop(&pt);
	}		
}

2.8栈销毁

//栈销毁
void StackDestory(ST* pt)
{
	assert(pt);
	free(pt->array);
	pt->array = NULL;
	pt->capacity = pt->top = 0;
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int datatype;
typedef struct StackNods
{
	datatype * array;
	size_t top;
	size_t capacity;
}ST;


//栈的初始化
void Stackinit(ST *pt)
{
	assert(pt);
	pt->array = (datatype*)malloc(sizeof(datatype) * 4);
	if (pt->array == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	pt->capacity = 4;
	pt->top = 0;
}
//压栈
void StackPush(ST* pt,datatype x)
{
	assert(pt);
	ST* tmp=NULL;
	if (pt->top == pt->capacity)//表示栈满了 -》扩容
	{
		tmp = (datatype*)realloc(pt->array, pt->capacity * sizeof(datatype) * 2);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			pt->array = tmp;
			pt->capacity*=2;//容量变成两倍
		}
	}
	pt->array[pt->top] = x;
	pt->top++;
}
//出栈
void StackPop(ST* pt)
{
	assert(pt);
	//栈空了,调用Top,直接种植程序报错
	assert(pt->top > 0);
	pt->top--;
}
//取栈顶元素
datatype StackTop(ST* pt)
{
	assert(pt);
	assert(pt->top > 0);
	return pt->array[pt->top - 1];
}
//求栈内元素个数
int StackSize(ST* pt)
{
	assert(pt);
	return pt->top;
}
//判栈空
bool StackEmpty(ST* pt)
{
	assert(pt);
	return pt->top == 0;
}
//
void StackPrintf(ST pt)
{
	while (pt.top)
	{
		printf("%d ", pt.array[pt.top - 1]);
		StackPop(&pt);
	}	
	printf("\n");
}
//栈销毁
void StackDestory(ST* pt)
{
	assert(pt);
	free(pt->array);
	pt->array = NULL;
	pt->capacity = pt->top = 0;
}
int main()
{
	ST pt;
	Stackinit(&pt);
	StackPush(&pt, 1);
	StackPush(&pt, 1);
	StackPush(&pt, 2);
	StackPush(&pt, 3);
	StackPush(&pt, 4);
	StackPrintf(pt);
	printf("栈内元素个数有%d 个",StackSize(&pt));
	StackDestory(&pt);
	return 0;
}

以上就是栈的一些基本操作啦,谢谢大家支持!

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

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

相关文章

Spark使用map函数出现:Python worker exited unexpectedly (crashed)

目录 1. 版本异常处理 2. 环境变量异常 1. 版本异常处理 版本问题&#xff1b; 本编使用的是python12.exe解释器&#xff0c;解决问题&#xff0c;将python.exe版本降低即可&#xff0c;我这里降低到了python10.exe&#xff1b; 这是错误日志&#xff1a; 官方下载python解…

Windows Docker 部署 VictoriaMetrics 数据库

一、简介 VictoriaMetrics&#xff08;VM&#xff09;是一个快速、高效、经济且可扩展的监控解决方案和时序数据库。它提供了数据存储、管理、处理和分析的强大功能&#xff0c;专注于时间序列数据&#xff0c;并具备高吞吐量和低延迟特性&#xff0c;适用于各类大规模数据场景…

javaWeb项目-ssm+vue医院住院信息管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java简介 现代社…

STM32—U8g2图形库练习

一、新建CubeMX工程 1.照例将RCC配置为外部高速晶振&#xff08;精度更高&#xff09;——HSE&#xff1b;将SYS的Debug设置成Serial Wire&#xff08;否则可能导致芯片自锁)&#xff1b; 2.配置I2C2作为OLED的通讯方式。 3.TIM1配置&#xff1a;U8g2图形库需要us级延迟推动&…

Flutter鸿蒙终端一体化-天下一统

在前面的文章中&#xff0c;我们了解了如何使用FlutterPage来创建Flutter容器。 Flutter鸿蒙终端一体化-混沌初开 Flutter鸿蒙终端一体化-珠联璧合 语雀 但更多的时候&#xff0c;我们需要的是一种类似FlutterFragment的方式来进行引用&#xff0c;可喜的是&#xff0c;鸿蒙…

【C++题解】1121 - “倒”数

问题&#xff1a;1121 - “倒”数 类型&#xff1a;需要找规律的循环 题目描述&#xff1a; 输入一个正整数 N&#xff08;0<N<2147483647&#xff09;&#xff0c;将这个数倒着合成一个新数后输出。 比如&#xff1a; 543 &#xff0c;倒过来是345 &#xff08;请注意…

论文笔记:Frozen Language Model Helps ECG Zero-Shot Learning

2023 MIDL 1 intro 心电图&#xff08;ECG&#xff09;被广泛应用于检测各种心脏疾病&#xff0c;包括心律失常、心脏病发作和心力衰竭等近些年深度学习方法在心电图数据分类领域取得了不错的效果。 基于深度学习的ECG数据分类方法&#xff0c;通常以监督学习范式进行训练&am…

嵌入式系统中的异常和中断

目录 概述 1 异常和中断的概念 1.1 异常 1.1.1 同步异常 1.1.2 异步异常 1.2 中断 2 了解异常和中断 2.1 可编程中断控制器和外部中断 2.2 异常的分类 2.3 异常的优先权 2.4 中断和异常处理 3 处理一般异常的方法 概述 本文主要介绍嵌入式系统中的异常和中断的一…

B站画质补完计划(3):智能修复让宝藏视频重焕新生

1 老片存在什么画质问题&#xff1f; B站作为一个拥有浓厚人文属性的平台社区&#xff0c;聚集了诸如《雍正王朝》、《三国演义》等经典影视剧集&#xff0c;同时也吸引了大量用户欣赏、品鉴这些人文经典 。但美中不足的是&#xff0c;由于拍摄年代久远、拍摄设备落后、数据多次…

信息系统项目管理师0151:输出(9项目范围管理—9.4收集需求—9.4.3输出)

点击查看专栏目录 文章目录 9.4.3 输出9.4.3 输出 需求文件 需求文件描述各种单一需求将如何满足项目相关的业务需求。一开始可能只有高层级的需求,然后随着有关需求信息的增加而逐步细化。只有明确的(可测量和可测试的)、可跟踪的、完整的、相互协调的,且主要干系人愿意认…

Json-server 的使用教程

目录 前言一、简介二、安装与配置1. 安装 node-js2. npm 镜像设置3. 安装 json-server 三、使用1. 创建本地数据源2. 启动 Json Server3. 操作数据&#xff08;1&#xff09;查询数据&#xff08;2&#xff09;新增数据&#xff08;3&#xff09;修改数据&#xff08;4&#xf…

swift微调牧歌数据电商多模态大语言模型

大规模中文多模态评测基准MUGE_数据集-阿里云天池多模态理解和生成评估挑战榜(MUGE)是由阿里巴巴达摩院智能计算实验室发起,由阿里云天池平台承办,并由浙江大学、清华大学等单位共同协办。 Mhttps://tianchi.aliyun.com/dataset/107332微调的是牧歌数据集,结果都不好,记录…

数据结构(DS)学习笔记(二):数据类型与抽象数据类型

参考教材&#xff1a;数据结构C语言版&#xff08;严蔚敏&#xff0c;杨伟民编著&#xff09; 工具&#xff1a;XMind、幕布、公式编译器 正在备考&#xff0c;结合自身空闲时间&#xff0c;不定时更新&#xff0c;会在里面加入一些真题帮助理解数据结构 目录 1.1数据…

适配器模式和装饰器模式

文章目录 适配器模式1.引出适配器模式1.多功能转换插头2.基本介绍3.工作原理 2.类适配器1.基本介绍2.类图3.代码实现1.Voltage220V.java2.Voltage5V.java3.VoltageAdapter.java4.Phone.java5.Client.java6.结果 4.类适配器的注意事项 3.对象适配器1.基本介绍2.使用对象适配器改…

Linux/Windows 安装 RocketMQ 详细图文教程!

Linux 安装 RocketMQ 首先&#xff0c;你需要从RocketMQ的官方网站或GitHub仓库下载最新的RocketMQ发行版下载安装&#xff0c;官网下载地址&#xff1a;https://rocketmq.apache.org/download/。 接下来配置环境变量&#xff1a; 输入vim /etc/profile命令配置环境变量输入i进…

人工智能强化学习:核心内容、社会影响及未来展望

欢迎来到 Papicatch的博客 文章目录 &#x1f40b;引言 &#x1f40b;强化学习的核心内容 &#x1f988;强化学习基本概念 &#x1f40b;强化学习算法 &#x1f988;Q学习&#xff08;Q-Learning&#xff09; &#x1f988;深度Q网络&#xff08;Deep Q-Network, DQN&…

我在地球学Python基础第一篇:计算机组成原理基本知识和编程语言基础知识

业精于勤荒于嬉&#xff0c;行成于思毁于随。 今天开始系统记录学习Python 第一篇 计算机组成原理一、什么是计算机二、计算机是由什么组成的&#xff1f;2.1 硬件系统2.2 软件系统 三、计算机如何处理程序&#xff1f;四、编程语言 计算机组成原理 学习目标&#xff1a; 1、…

python怎么保留小数

保留两位小数&#xff0c;并做四舍五入处理 方法一&#xff1a;使用字符串格式化 a 12.345 print("%.2f" % a)# 12.35 方法二&#xff1a;使用round内置函数 a 12.345 a1 round(a, 2) print(a1)# 12.35 方法三&#xff1a;使用decimal模块 from decimal import D…

企业级开源项目,云缓存解决方案:CacheCloud

CacheCloud&#xff1a;简化缓存管理&#xff0c;释放数据潜力- 精选真开源&#xff0c;释放新价值。 概览 CacheCloud是由搜狐视频团队开发的一款开源的Redis缓存云平台&#xff0c;支持Redis多种架构(Standalone、Sentinel、Cluster)高效管理、有效降低大规模redis运维成本&…

AI网络爬虫:批量爬取AI导航网站Futurepedia数据

Futurepedia致力于使AI技术对各行各业的专业人士更加可理解和实用&#xff0c;提供全面的AI网站和工具目录、易于遵循的指南、每周新闻通讯和信息丰富的YouTube频道&#xff0c;简化AI在专业实践中的整合。如何把Futurepedia上的全部AI网站数据爬取下来呢&#xff1f; 网站一页…