数据结构之线性表(4)

news2024/11/18 23:22:40

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

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;
}

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

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

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

相关文章

【Mybatis】动态SQL内置参数

配置映射关系的xml文件里&#xff0c;所有的参数都是来自接口方法的传值&#xff0c;但是Mybatis内部&#xff0c;其实还有两个很有作用的内置参数的 ①_databaseId: 在全局变量中配置了多数据库支持的databaseIdProvider属性的前提下&#xff0c;这个内置参数的值就是databas…

【Java】在你上一家公司中是如何如何实现蓝绿发布的?

一、问题解析 随着微服务应用的不断增加&#xff0c;各个微服务之间的依赖关系也变得比较复杂&#xff0c;各个微服务的更新、升级部署给整个服务域的稳定性带来很大挑战。怎么以不停机的方式部署升级微服务呢&#xff1f; 在进行技术方案的设计之前&#xff0c;我们先来了解…

opencv_核心操作

图像基本操作 访问和修改像素值 import numpy as np import cv2 img cv2.imread(c:/Users/HP/Downloads/basketball.png) h,w,c img.shape #图像大小 print(h,w,c)### 841 1494 3# 通过行和列坐标访问像素值 img[100,100]### 231 ### array([231, 140, 146], dtypeuint8)# …

WordPress 站点 Wp-Login.Php 登录页面,防止被机器扫描爆破终极方法

最近好像不少的 WordPress 站点又迎来了一波疯狂的 wp-login.php 登录页面暴力破解,明月使用的 Dragon 主题也迅速的做出了安全防范响应,第一时间就增强了代码上的安全防御能力。明月代运维的几个站点也在这方面加强了防范措施,基本上实现了永久解决这一顽疾的目标,今天明月…

智能编程支持分析本地工程文件,项目级开发效率再度提升!

CodeGeeX的智能问答新增关联本地文件的系列功能&#xff0c;用户在智能问答的输入框中输入&#xff0c;就可以在弹出框中选择需要使用的指令。从而能够针对所关联的文件给出更有针对性的问答和代码建议。 下面我们将分别介绍在编程工作中&#xff0c;如何关联本地文件&#xff…

Shell脚本01

一、shell脚本 脚本就是可运行的代码的集合&#xff0c;脚本语言&#xff08;计算机语言&#xff09;。 脚本的特点&#xff1a;从上到下&#xff0c;按行执行。 shell 脚本就是在shell环境&#xff08;bin/bash&#xff09;bash就是shell解释器&#xff0c;linux环境下的编…

pytest+requests+allure自动化测试接入Jenkins学习

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近在这整理知识&#xff0c;发现在pytest的知识文档缺少系统性&#xff0c;这里整理一下&…

MCU为什么上电不启动

相信很多朋友们都遇到过&#xff0c;自信满满的将程序下载到板子上&#xff0c;发现MCU居然没启动。 那这个现象可能有很多问题会导致&#xff0c;让我们来看看会有哪些原因。 1、BOOT引脚电平不对&#xff1a; 在GD32 MCU上&#xff0c;BOOT引脚决定了MCU的启动方式&#x…

zabbix监控深信服AD案例+自动发现虚拟服务和链路

文章目录 前言监控功能告警功能 环境准备操作步骤深信服AD开启SNMPSNMP V2SNMP V3 Zabbix导入模版Zabbix中添加深信服AD 前言 深信服AD&#xff0c;应用交付网关&#xff0c;是较为常见的应用发布、负载均衡设备&#xff0c;常用于网络出口。 本案例是通过zabbix的snmp监控深…

拥抱AI-图片学习中的卷积神经算法详解

一、定义 卷积神经算法&#xff08;Convolutional Neural Networks, CNN&#xff09;是深度学习领域中的一种重要算法&#xff0c;特别适用于处理图像相关的任务。以下是卷积神经算法的详细解释&#xff1a; 1. 基本概念 定义&#xff1a;卷积神经网络是一类包含卷积计算且具…

网络代理加速器:太阳HTTP的新一代解决方案(网络代理IP)

在当今数字化时代&#xff0c;网络速度与稳定性是企业和个人用户最为关注的重要问题之一。面对不稳定的网络连接&#xff0c;延迟高和速度慢等问题&#xff0c;传统的网络代理已经难以满足用户的需求。 为了解决这一问题&#xff0c;太阳HTTP推出了全新一代的网络代理加速器&a…

SQL Server 2016导入.bak文件到数据库里面步骤

1、打开SSMS管理器 选择数据库 右键 然后点击还原数据库。 2、选择设备 然后点击三个点 找到本地bak文件&#xff0c;然后点击确定 3、点击确定&#xff0c;会自动弹出来一个成功的提示。

消费增值模式引领业绩飙升与用户活跃

大家好&#xff0c;我是吴军&#xff0c;致力于为您揭示私域电商领域的独特魅力与机遇。 今日&#xff0c;我很高兴与大家分享一个激动人心的成功案例。我们的客户在短短一个月的时间里&#xff0c;业绩就飙升至上百万级别&#xff0c;其用户活跃度更是居高不下&#xff0c;日…

express+宝塔实现文件上传服务

文章目录 服务器部分开启存放文件的端口配置nginx该端口入口手动在/www/wwwroot/file目录下存放一张图片进行访问 express接口部分代码测试 服务器部分 开启存放文件的端口 我这里以83为例 先到对应的服务商开启端口&#xff0c;比如我这里是阿里云 测试&#xff0c;比如这里…

武汉凯迪正大—绝缘强度的测试设备 工频高压耐压交流试验仪 工频耐压试验机

武汉凯迪正大电气有限公司生产KDJS-8A全自动工频耐压试验系统&#xff08;10kVA全自动操作台&#xff09;&#xff0c;是根据国家行业试验标准而设计的试验设备&#xff0c;其安全可靠、功能强、使用方便、维护简单。主要用于对各种电器产品、电气元件、绝缘材料等进行规定电压…

vue3根据按钮切换更新echarts对应的数据

效果图 初始化注意 setOption的函数定义&#xff0c;option是指图表的配置项和数据&#xff0c;notMerge是指是否不跟之前设置的 option 进行合并。默认为 false。即表示合并。如果为 true&#xff0c;表示所有组件都会被删除&#xff0c;然后根据新option 创建所有新组件 //…

如何学习Django4?看这16堂课就够了

目录 写在前面 推荐图书 内容简介 作者简介 前言/序言 改编说明 推荐理由 写在后面 写在前面 本期博主给大家推荐一本关于Python Django4的图书&#xff08;2024年3月刚出版&#xff09;&#xff0c;感兴趣的小伙伴快来看看吧&#xff01; 推荐图书 《Python Django…

网络安全比赛-网络安全事件响应-Server2216(解析)

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1、黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 2、黑客通过网络攻入本地服务器,…

72、AndroidStudio 导入项目Connect timed out错误解决

一、背景&#xff1a; 开发过程中难免会 clone 其他的项目&#xff0c;clone 或者下载成功之后。使用 android studio 打开项目时经常遇到 Connect timed out错误如图所示&#xff1a; 二、分析原因&#xff1a; 1、既然链接超时&#xff0c;肯定是 android studio 在运行…

python 魔术方法备忘录

python 魔术方法备忘录 网上收集了一些&#xff0c;列出了比较常用的&#xff0c;特别是第一张。 Python中的魔术方法&#xff08;Magic Methods&#xff09;&#xff0c;也被称为特殊方法&#xff08;Special Methods&#xff09;或双下划线方法&#xff08;Dunder Methods&a…