数据结构——顺序栈seq_stack

前言:大家好😍,本文主要介绍了数据结构——顺序栈

目录

一、概念

1.1 顺序栈的基本概念

1.2 顺序栈的存储结构

二、基本操作

2.1 结构体定义

2.2 初始化 

2.3 判空

2.4 判满

2.5 扩容

2.6 插入 入栈

2.7 删除 出栈

2.8 获取栈顶元素

2.9 获取有效值长度

2.10 清空

2.11 销毁

2.12 打印

2.13 测试


一、概念

顺序栈是栈的一种实现方式,它是基于顺序存储结构(通常是数组或动态分配的内存空间)实现的栈。栈是一种**后进先出(LIFO,Last In First Out)**的数据结构,这意味着最后放入栈中的元素会最先被取出。

1.1 顺序栈的基本概念

  1. 栈的定义

    • 栈是一种线性表,其操作主要在表的一端进行,这一端称为栈顶(Top),另一端称为栈底(Bottom)

    • 栈的操作遵循**后进先出(LIFO)**的原则,即最后放入栈中的元素最先被取出。

  2. 顺序栈的特点

    • 顺序栈使用连续的内存空间来存储栈中的元素,通常通过数组或动态分配的内存来实现。

    • 栈底的位置是固定的,通常用一个指针(如base)来标记栈底。

    • 栈顶的位置是动态变化的,用一个指针(如top)来表示栈顶的位置。

1.2 顺序栈的存储结构

顺序栈的存储结构通常包括以下部分:

ps是一个指向Seq_Stack结构体的指针,所以    ps可以指向结构体的成员

  • base:指向栈底的指针,标记栈的起始位置。

  • top:栈顶指针,表示栈顶的位置。top的值通常等于栈中元素的数量。

  • stacksize:表示栈的总容量,即栈可以存储的最大元素数量。

二、基本操作

2.1 结构体定义

typedef char ELEM_TYPE;
#define INITSIZE 10//*2struct Seq_Stack
{ELEM_TYPE* base;//指针,用来接收malloc的返回值int top;//栈顶指针int stacksize;//当前总的格子数
};
typedef struct Seq_Stack Seq_Stack;
typedef struct Seq_Stack* PSeq_Stack;

base是一个指针,它的作用是标记栈的底部位置,也就是这块连续内存空间的起始地址。有了base,我们就能找到栈的“根基”,从而操作整个栈。无论栈顶指针top如何变化(入栈或出栈),base始终指向栈的底部,确保我们不会迷失方向。

2.2 初始化 

void Init_Seq_Stack(Seq_Stack* ps)
{assert(ps != NULL);ps->base = (ELEM_TYPE*)malloc(INITSIZE * sizeof(ELEM_TYPE));if (ps->base == NULL)//内存分配失败{exit(1);//程序调用exit终止运行}ps->top = 0;ps->stacksize = INITSIZE;
}
  • 参数Seq_Stack* ps 是一个指向Seq_Stack结构体的指针。这个结构体定义了栈的基本属性,比如栈底指针、栈顶指针和栈的容量等。

  • ps->base:这是栈底指针,用来存储malloc分配的内存地址分配完内存后,ps->base就指向了这块内存的起始位置,也就是栈的底部。malloc:这是一个动态内存分配函数,用来在堆上分配一块内存空间

  • ps->top = 0:栈顶指针top初始化为0。在顺序栈中,top的值通常表示栈中元素的数量。初始时栈为空,所以top为0。

  • ps->stacksize = INITSIZE:将栈的总容量stacksize设置为初始大小INITSIZE。这样我们就知道栈一开始可以存储多少个元素。

  • 通过ps,函数可以访问和修改这个栈的内部数据(如basetopstacksize)。

2.3 判空

//2.判空(判断顺序表有没有元素)
bool Is_Empty(Seq_Stack* ps)
{if (ps == NULL)exit(1);return ps->top ==0;
}
  • 这个指针ps就是用来告诉函数“我要检查的是哪一个栈”。

  • if (ps == NULL)来检查指针是否为空。如果是空的,说明传入的栈是无效的,程序会调用exit(1)终止运行,避免后续操作出错。

2.4 判满

bool Is_Full(Seq_Stack* ps)
{if (ps == NULL)return false;return ps->top == ps->stacksize;
}

2.5 扩容

//4.扩容
static void Inc(Seq_Stack*ps)
{assert(ps != NULL);if (ps == NULL)return;ELEM_TYPE* tmp = (ELEM_TYPE*)realloc(ps->base, ps->stacksize * sizeof(ELEM_TYPE) * 2);if (tmp != NULL)ps->base = tmp;ps->stacksize *= 2;
}

Inc函数用于将顺序栈的容量加倍。从而允许更多的元素入栈。

  • realloc:这是一个动态内存分配函数,用来重新分配一块内存空间。它接受两个参数:

    • 第一个参数是当前内存块的指针(这里是ps->base)。

    • 第二个参数是新的内存大小(这里是ps->stacksize * sizeof(ELEM_TYPE) * 2)。ps->stacksize是当前栈的容量,sizeof(ELEM_TYPE)是每个元素的大小,* 2表示将容量加倍。

    • tmp:这是一个临时指针,用来存储realloc返回的新内存地址。如果realloc成功,它会返回新的内存块的指针;如果失败,它会返回NULL

    • 如果tmp不为NULL,说明realloc成功,新的内存已经分配好了。此时,ps所指向的结构体中的base成员更新为tmp的值。,即让栈底指针指向新的内存地址。

    • 将栈的总容量stacksize加倍。

2.6 插入 入栈

//插入元素(入栈/压栈)   Push
bool Push(Seq_Stack* ps, ELEM_TYPE val)
{assert(ps != NULL);if (ps == NULL)return false;if (Is_Full(ps)){Inc(ps);}ps->base[ps->top] = val;ps->top++;return true;
}
  • ps->base[ps->top] = val;:将新元素val插入到栈顶位置。ps->top表示栈顶指针,ps->base[ps->top]表示栈顶位置的内存地址。这里将新元素val存储到栈顶位置。

  • ps->top++;:将栈顶指针ps->top加1,表示栈中元素的数量增加了一个。

2.7 删除 出栈

bool Pop(Seq_Stack* ps)
{assert(ps != NULL);if (ps == NULL)return false;if (Is_Empty(ps))return false;ps->top--;return true;
}

2.8 获取栈顶元素

ELEM_TYPE Top(Seq_Stack* ps)
{assert(ps != NULL);if (ps == NULL)exit(1);if (Is_Empty(ps))exit(1);return ps->base[ps->top - 1];return true;
}
  • ps->base[ps->top - 1]:栈顶元素的索引是ps->top - 1,因为ps->top表示栈中元素的数量,而数组索引是从0开始的。因此,ps->base[ps->top - 1]表示栈顶元素的值。

2.9 获取有效值长度

//5.获取有效值长度  Size
int Get_length(Seq_Stack* ps)
{assert(ps != NULL);if (ps == NULL)return -1;return ps->top;
}

2.10 清空

//6.清空  不需要free
void Clear(Seq_Stack* ps)
{assert(ps != NULL);if (ps == NULL)return;ps->top = 0;
}

2.11 销毁

//7.销毁 需要free
void Destroy(Seq_Stack* ps)
{assert(ps != NULL);if (ps == NULL)return;free(ps->base);ps->base = NULL;ps->top = ps->stacksize = 0;
}

Destroy函数的作用是销毁一个顺序栈,并释放它所占用的动态内存。 

  • 调用free(ps->base)会释放ps->base指向的内存空间。释放内存后,这块内存就不再属于程序了,程序不能再使用它。

2.12 打印

//8.打印
void Show(Seq_Stack* ps)
{//assertfor (int i = 0; i < ps->top; i++){printf("%c ", ps->base[i]);}printf("\n");
}
  • ps->base:这是栈底指针,指向栈的起始内存地址。

  • ps->base[i]:表示栈中第i个元素的值。数组名本质上是一个指向数组首元素的指针。eg:arr&arr[0]是等价的,都表示数组的起始地址。

2.13 测试

//顺序栈测试用例
int main()
{/*srand((unsigned int)time(NULL));int tmp = rand() % 29 + 1;printf("%d\n", tmp);*/Seq_Stack head;Init_Seq_Stack(&head);Push(&head, 'A');Push(&head, 'B');Push(&head, 'C');Show(&head);//A B Cprintf("%c\n", Top(&head));//CPop(&head);//A BShow(&head);//A B return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构初阶-二叉树的应用

1.单值二叉树 题目链接&#xff1a;https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路&#xff1a;我们把根结点与左孩子和右孩子进行比较&#xff0c;只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false&#xff0c;最…

【网络层协议】NAT技术内网穿透

IP地址数量限制 我们知道&#xff0c;IP地址&#xff08;IPv4&#xff09;是一个4字节32位的整数&#xff0c;那么一共只有2^32也就是接近43亿个IP地址&#xff0c;而TCP/IP协议栈规定&#xff0c;每台主机只能有一个IP地址&#xff0c;这就意味着&#xff0c;一共只有不到43亿…

快速入手-基于Django的mysql配置(三)

Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。比如mysql&#xff0c;旧版本用pymysql对比较多&#xff0c;新的版本采用mysqlclient。 1、安装mysql模块 pip install mysqlclient 2、Django的ORM主要做了两件事 &#xff08;1&#xff09;CRUD数据库中的表&am…

ETL:数据清洗、规范化和聚合的重要性

在当今这个数据呈爆炸式增长的时代&#xff0c;数据已成为企业最为宝贵的资产之一。然而&#xff0c;数据的海量增长也伴随着诸多问题&#xff0c;如数据来源多样、结构复杂以及质量问题等&#xff0c;这些问题严重阻碍了数据的有效处理与深度分析。在此背景下&#xff0c;ETL&…

【leetcode hot 100 208】实现Trie(前缀树)

解法一&#xff1a;字典树 Trie&#xff0c;又称前缀树或字典树&#xff0c;是一棵有根树&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组 children。对于本题而言&#xff0c;数组长度为 26&#xff0c;即小写英文字母的数量。此时 children[0] 对应小…

PyTorch生成式人工智能实战:从零打造创意引擎

PyTorch生成式人工智能实战&#xff1a;从零打造创意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能简介1.2 生成式人工智能技术 2. Python 与 PyTorch2.1 Python 编程语言2.2 PyTorch 深度学习库 3. 生成对抗网络3.1 生成对抗网络概述3.2 生成对抗网络应用 4. Transformer4…

vue中上传接口file表单提交二进制文件流

1.使用elementui上传组件 要做一个选择文件后&#xff0c;先不上传&#xff0c;等最后点击确定后&#xff0c;把file二进制流及附加参数一起提交上去。 首先使用elementui中的上传组件&#xff0c;设置auto-uploadfalse&#xff0c;也就是选择文件后不立刻上传。 <el-uplo…

深入解析 Java Stream API:筛选根节点的优雅实现!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;筛选根节点的优雅实现 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 从 List 中筛选出特定条件的元素。&#x1f389; 具体来说&#xff0c;我…

推荐1款简洁、小巧的实用收音机软件,支持手机和电脑

聊一聊 没想到现在还有人喜欢听广播。 我一直以为听广播必须要用那种小广播机才可以。 原来手机或电脑上也是可以的。 今天给大家分享一款可以在电脑和手机上听广播的软件。 软件介绍 龙卷风收音机 电台广播收音机分电脑和手机两个版本。 电脑端无需安装&#xff0c;下载…

金桔网桥路由版3

上一集我们讲到了二层云交换机&#xff0c;我把在云上搭建的桥接模式的VPN服务器称为二层云交换机。 那么现在我家到办公室的网络结构就变成这样的&#xff0c; 这样的好处就是我的电视盒子通过网线看电视&#xff0c;走的是OpenWrt路由器通过二层云交换机由办公室的OpenWrt路由…

常见中间件漏洞攻略-Tomcat篇

一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步&#xff1a;开启靶场 第二步&#xff1a;在首页抓取数据包&#xff0c;并发送到重放器 第三步&#xff1a;先上传尝试一个1.txt进行测试 第四步&#xff1a;上传后门程序 第五步&#xff1a;使用哥斯拉连接 二、后…

计算机复试面试

数据库 1.设计过程/设计步骤 1.需求分析&#xff1a;明确客户需求&#xff0c;确定系统边界&#xff0c;生成数据字典 2.概念结构设计&#xff1a;将用户需求抽象为概念模型&#xff0c;绘制e-r图 3.逻辑结构设计&#xff1a;将e-r图转化为dbms相符合的逻辑结构&#xff0c;db…

【零基础学python】python基础语法(一)

前言&#xff1a;Python 是当今最受欢迎的编程语言之一&#xff0c;其广泛应用于 人工智能、数据科学、Web 开发、自动化 等多个领域。它以 简洁的语法、强大的标准库 和 跨平台兼容性 深受开发者喜爱。作为 机器学习和大数据的首选语言&#xff0c;Python 在学术研究、金融分析…

数据类设计_图片类设计之8_自由图形类设计_(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 前面的内容都是矩阵图形类,现在讨论自由图形类设计 矩阵图形类和自由图形类的差别 左图为矩阵图形类对象,右图为自由图形类对象.矩阵图形类对象单独占据一个矩…

【学习记录】大模型微调之使用 LLaMA-Factory 微调 Qwen系列大模型,可以用自己的数据训练

一、LoRA微调的基本原理 1、基本概念 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于大模型微调的技术&#xff0c;通过引入低秩矩阵来减少微调时的参数量。在预训练的模型中&#xff0c;LoRA通过添加两个小矩阵B和A来近似原始的大矩阵ΔW&#xff0c;从而减少需…

绿盟CSSP靶场-将已有虚拟机创建为新镜像作为新虚拟机模板

将部署了自定义软件的虚拟机&#xff0c;【保持镜像】将这个在运的虚拟机存为一个新的镜像。 为了保证上传的镜像是完整的&#xff0c;勾选【全量镜像】。 等待镜像上传完成&#xff0c;可以看到刚刚上传的镜像&#xff0c;状态也为已上传。 将镜像从私有改为共享&#xff0c;…

VMWare Ubuntu 详细安装教程

VMWare Ubuntu 详细安装教程 一、下载安装VMware二、下载 Ubuntu 镜像文件三、安装 Ubuntu四、开启虚拟机 一、下载安装VMware 官网下载地址https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion知乎大佬的博客原文&#xff0c;含下载地址https://zhua…

嵌入式c学习八

练习 一、指针数组与数组指针 #include <stdio.h>int main() {//c是一个指针数组&#xff0c;里面有4个元素每个元素都是指针 char *c[] {"hello", "world", "homed", "gotogo"}; //cp是指针数组&#xff0c;有4个元素&#…

LLaMA-Factory微调大模型

LLaMA-Factory安装 github 下载 LLaMA-Factory项目 创建虚拟环境 conda create -n llama_factory python3.10 激活 activate llama_factorytorch 安装 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia依赖安装 …

第一讲 | 解锁C++编程能力:基础语法解析

C入门基础 一、C的第一个程序二、命名空间三、C输入&输出四、缺省参数/默认参数五、函数重载六、引用1.引用的特性2.引用的使用引用做返回值场景 3.const引用只有指针和引用涉及权限放大、缩小的问题&#xff0c;普通变量没有 4.指针和引用的关系 七、inline八、nullptr 一…