顺序栈算法库构建

学习贺利坚老师,顺序栈,构建顺序栈算法库

数据结构之自建算法库——顺序栈_设计一个主函数实现对顺序栈进行操作测试,测试方法,依次把元素-CSDN博客文章浏览阅读4.9k次,点赞10次,收藏10次。本文针对数据结构基础系列网络课程(2):线性表中第3课时栈的顺序存储结构及其基本运算实现。按照“0207将算法变程序”[视频]部分建议的方法,建设自己的专业基础设施算法库。顺序栈算法库采用程序的多文件组织形式,包括两个文件:      1.头文件:sqstack.h,包含定义顺序栈数据结构的代码、宏定义、要实现算法的函数的声明;#ifndef SQSTACK_H_INCLUDED#defi_设计一个主函数实现对顺序栈进行操作测试,测试方法,依次把元素https://blog.csdn.net/sxhelijian/article/details/48463527本人详细解析博客:

顺序栈文章浏览阅读4.1k次,点赞4次,收藏20次。栈和队列主要用于计算过程中保存的临时数据,如果数据在编程时就可以确定,那么使用几个变量就可以临时存储,但是如果存储的数据项数不能确定,就需要复杂的存储机制。这样的存储机制称为缓存。栈和队列就是使用最多的缓存结构。我们在调用方法的时候 , 时常调用别的成员方法, 递归循环调用 , 那调用到最后,又从最后一个函数,依次返回值 , 我们熟悉这个机制.但是我们却不知道 , 编译器是如何把这些调用信息存储起来的,用什么方法存储起来的, 这里就需要我们用到栈了,先进后出还有生活中 , 我们往木桶里放球 ,_栈的应用https://blog.csdn.net/qq_57484399/article/details/127185102版本更新日志:

v1.0: 完成基本功能

V1.0

功能函数:

//(1)初始化顺序栈
void Init_Sequential_stack(Sequential_stack *&s);
//(2)销毁顺序栈
void Destroy_Sequential_stack(Sequential_stack *&destroy_Stack);
//(3)输出展示顺序栈
void Display_Sequential_stack(Sequential_stack *show_Stack);
//(4) 将一个元素入栈
bool Push_Sequential_stack(Sequential_stack *&push_Stack, ElemType push_value);
//(5) 将一个元素出栈
bool Pop_Sequential_stack(Sequential_stack *&pop_Stack, ElemType &pop_value);
//(6)判断栈是否为空
bool Empty_Sequential_stack(Sequential_stack *judge_Stack);
//(7)求顺序栈中元素个数--栈长度
int Length_Sequential_stack(Sequential_stack *Quantity_length_Stack);
//(8) 访问获得栈顶元素
bool GetTop_Sequential_stack(Sequential_stack *visited_Stack, ElemType &get_value);

Sequential_stack.h

#ifndef SEQUENTIAL_STACK_H_INCLUDE
#define SEQUENTIAL_STACK_H_INCLUDE

#include "stdio.h"
#include <malloc.h>

#define MaxSize 100

typedef char ElemType;

typedef struct
{
    ElemType data[MaxSize]; //顺序栈用来存储数据的数组
    int top;            //定义栈顶指针

}Sequential_stack;  //顺序栈定义

//(1)初始化顺序栈
void Init_Sequential_stack(Sequential_stack *&s);
//(2)销毁顺序栈
void Destroy_Sequential_stack(Sequential_stack *&destroy_Stack);
//(3)输出展示顺序栈
void Display_Sequential_stack(Sequential_stack *show_Stack);
//(4) 将一个元素入栈
bool Push_Sequential_stack(Sequential_stack *&push_Stack, ElemType push_value);
//(5) 将一个元素出栈
bool Pop_Sequential_stack(Sequential_stack *&pop_Stack, ElemType &pop_value);
//(6)判断栈是否为空
bool Empty_Sequential_stack(Sequential_stack *judge_Stack);
//(7)求顺序栈中元素个数--栈长度
int Length_Sequential_stack(Sequential_stack *Quantity_length_Stack);
//(8) 访问获得栈顶元素
bool GetTop_Sequential_stack(Sequential_stack *visited_Stack, ElemType &get_value);

#endif // SEQUENTIAL_STACK_H_INCLUDE

Sequential_stack.cpp

#include "Sequential_stack.h"

/**************************************************
(1)函数名: Init_Sequential_stack
功  能: 初始化顺序栈
参  数: Sequential_stack *&init_Stack:要进行初始化的栈
返回值: 无
**************************************************/
void Init_Sequential_stack(Sequential_stack *&init_Stack)
{
      init_Stack = (Sequential_stack *)malloc(sizeof(Sequential_stack));
      init_Stack->top = -1;  //毕竟是数组, 栈顶指针序号具有权威,序号之上默认空(可替换)
}

/**************************************************
(2)函数名: Destroy_Sequential_stack
功  能: 销毁释放顺序栈空间
参  数: Sequential_stack *&destroy_Stack:要销毁的栈
返回值: 无
**************************************************/
void Destroy_Sequential_stack(Sequential_stack *&destroy_Stack)
{
    free(destroy_Stack);
}

/**************************************************
(3)函数名: Display_Sequential_stack
功  能: 输出展示栈内元素
参  数: Sequential_stack *show_Stack:要输出展示的栈
返回值: 无
**************************************************/
void Display_Sequential_stack(Sequential_stack *show_Stack)
{
    //从栈顶开始 , 从上往下,输出栈内元素
    int counter;
    printf("\n");
    for(counter = show_Stack->top; counter >= 0;  counter--)
    {
        printf("%c ",show_Stack->data[counter]);
    }
    printf("\n");
}
/**************************************************
(4)函数名: Push_Sequential_stack
功  能: 把一个元素,压入栈顶
参  数: (1)Sequential_stack *&push_Stack:要进行压入元素的顺序栈
        (2)ElemType push_value:要压入的元素值
返回值:bool: 是否压入成功? true(栈不满,压入成功):false(栈满压入失败)
**************************************************/

bool Push_Sequential_stack(Sequential_stack *&push_Stack, ElemType push_value)
{
    bool finished;
    if(push_Stack->top == MaxSize-1)
    {
        finished = false;
    }
    else
    {
        //栈不满代表可以入栈
        push_Stack->top++;
        push_Stack->data[push_Stack->top] = push_value;
        finished = true;
    }
    return finished;//单一出口
}

/**************************************************
(5)函数名: Pop_Sequential_stack
功  能: 出栈顶内元素
参  数: (1)Sequential_stack *&pop_Stack:要弹出栈顶元素的栈
        (2)ElemType &pop_value: 存储要弹出的栈顶元素的变量
返回值: bool:是否出栈成功? true(栈非空,出栈成功):false(栈空,失败)
**************************************************/
bool Pop_Sequential_stack(Sequential_stack *&pop_Stack, ElemType &pop_value)
{
    bool finished;//完成标志
    if(pop_Stack->top == -1)
    {
        finished = false;
    }
    else
    {
        //返回出栈元素
        pop_value = pop_Stack->data[pop_Stack->top];
        pop_Stack->top--;
        finished = true;
    }
    return finished;//单一出口
}

/**************************************************
(6)函数名: Empty_Sequential_stack
功  能: 判断顺序栈是否为空
参  数: Sequential_stack *judge_Stack:要进行判断的顺序栈
返回值: bool: 栈是否为空? true(栈为空):false(栈不空)
**************************************************/
bool Empty_Sequential_stack(Sequential_stack *judge_Stack)
{
    return (judge_Stack->top == -1);//true则空,false则非空
}

/**************************************************
(7)函数名: Length_Sequential_stack
功  能: 判断顺序栈栈内元素个数
参  数: Sequential_stack *Quantity_Stack:要进行判断元素个数的顺序栈
返回值: int: 栈内元素个数
**************************************************/
int Length_Sequential_stack(Sequential_stack *Quantity_Stack)
{
    return(Quantity_Stack->top+1);//数组--栈顶序号加一即为长度
}

/**************************************************
(8)函数名: GetTop_Sequential_stack
功  能: 得到栈顶元素值
参  数: (1)Sequential_stack *visited_Stack:要访问的顺序栈
        (2)ElemType &get_value:传回栈顶元素值
注  意:     ElemType &get_value:加地址符,需要传回数值
返回值: bool: 是否得到栈顶元素值? true(栈不空,得到栈顶元素):false(栈空)
**************************************************/
bool GetTop_Sequential_stack(Sequential_stack *visited_Stack, ElemType &get_value)
{
    bool finished;
    if(visited_Stack->top == -1)
    {
        finished = false;
    }
    else
    {
        get_value = visited_Stack->data[visited_Stack->top];//只访问
        finished = true;
    }
    return finished; //单一出口
}





main.cpp

#include <stdio.h>
#include "Sequential_stack.h"

int main()
{
    ElemType elem;
    Sequential_stack *test_stack;
    printf("\n(1)初始化栈test_stack\n");
    Init_Sequential_stack(test_stack);
    printf("\n(2)栈为%s\n",(Empty_Sequential_stack(test_stack)?"空":"非空"));
    printf("\n(3)依次进栈元素 a, b, c, d, e\n");
    Push_Sequential_stack(test_stack,'a');
    Push_Sequential_stack(test_stack,'b');
    Push_Sequential_stack(test_stack,'c');
    Push_Sequential_stack(test_stack,'d');
    Push_Sequential_stack(test_stack,'e');
    printf("\n(4)栈为%s\n",(Empty_Sequential_stack(test_stack)?"空":"非空"));
    printf("\n(5)栈的长度为:%d\n",Length_Sequential_stack(test_stack));
    printf("\n(6)从栈顶到栈底元素:\n");Display_Sequential_stack(test_stack);
    printf("\n(7)出栈序列:\n");
    while(!Empty_Sequential_stack(test_stack))
    {
        Pop_Sequential_stack(test_stack,elem);
        printf("\n%c\n",elem);
    }
    printf("\n(8)栈为%s\n",(Empty_Sequential_stack(test_stack)?"空":"非空"));
    printf("\n(9)释放栈\n");
    Destroy_Sequential_stack(test_stack);
    return 0;
}

运行结果演示:

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

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

相关文章

CRAFT文字检测算法解析和基于C++和TensorRT的推理实现

本文讲解了CVPR 2019的一篇文字检测算法《Character Region Awareness for Text Detection》的原理&#xff0c;并给出我使用C和TensorRT重新实现的推理&#xff0c;速度比原版代码快12倍。 论文&#xff1a;https://arxiv.org/pdf/1904.01941.pdf 官方代码&#xff1a;https:…

自然语言处理 (NLP) 的技术演变史

一、简述 本文的目标是了解自然语言处理 (NLP) 的历史&#xff0c;包括 Transformer 体系结构如何彻底改变该领域并帮助我们创建大型语言模型 (LLM)。 基础模型&#xff08;如 GPT-4&#xff09;是最先进的自然语言处理模型&#xff0c;旨在理解、生成人类语言并与之交互。 要理…

IPEmotion轻松解决急停设备的控制与数据存储问题

一 背景 众所周知&#xff0c;急停操作在各种工业领域中都扮演着非常重要的角色。在一个个紧急情况下&#xff0c;及时采取急停操作可节省宝贵时间&#xff0c;避免人身伤害或设备损坏&#xff0c;降低安全风险&#xff0c;尤其是在新能源测试中&#xff0c;出于对高压电性能方…

linux 关闭不了docker服务

[rootiZ2ze7y4akbxb1yjoydztxZ ~]# systemctl stop docker Warning: Stopping docker.service, but it can still be activated by: docker.socket 在 systemd 系统中&#xff0c;服务和套接字是分开管理的。docker.socket 是一个套接字单元&#xff0c;用于监听 Docker 的 API…

小程序AI智能名片S2B2C商城系统:五大营销技术模块深度剖析

在当今数字化营销的时代&#xff0c;小程序AI智能名片S2B2C商城系统凭借五大核心营销技术模块&#xff0c;为企业提供了强大的私域流量管理与营销能力。下面我们将逐一剖析这五大模块&#xff0c;看它们如何共同助力企业实现精准营销与业务增长。 一、小程序&#xff1a;用户触…

力扣刷题 70.爬楼梯

题干 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&…

机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day 23

Day 23 Self - Atention 变形 关于很多个former 的故事 痛点&#xff1a; 在于做出注意力矩阵之后的运算惊人 由于self - attention 一般都是在big model 的一部分&#xff0c;所以&#xff0c;一般不会对模型造成决定性的影响&#xff0c; 只有当model 的输入较长的时候&am…

求臻医学MRD产品斩获2023年度肿瘤标志物年度十大创新技术产品奖

2024年4月20日&#xff0c;中国肿瘤标志物学术大会开幕式暨名家讲坛在南京隆重召开! 会议期间&#xff0c;中国抗癌协会肿瘤标志专业委员会联合中国抗癌协会肿瘤临床检验与伴随诊断专业委员会、中国抗癌协会肿瘤基因诊断专业委员等共同发布“2023 年度肿瘤标志物创新技术产品”…

Java 提取HTML文件中的文本内容

从 HTML 文件中提取文本内容是数据抓取中的一个常见任务&#xff0c;你可以将提取的文本信息用于编制报告、进行数据分析或其他处理。本文分享如何使用免费 Java API 从HTML 文件中提取文本内容。 安装免费Java库&#xff1a; 要通过Java提取HTML文本&#xff0c;需要用到Free…

C语言实现双人贪吃蛇项目(基于控制台界面)

一.贪吃蛇 贪吃蛇是一款简单而富有乐趣的游戏&#xff0c;它的规则易于理解&#xff0c;但挑战性也很高。它已经成为经典的游戏之一&#xff0c;并且在不同的平台上一直受到人们的喜爱和回忆。 二.贪吃蛇的功能 游戏控制&#xff1a;玩家可以使用键盘输入设备来控制蛇的移动方…

基于模糊控制的纯跟踪横向控制在倒车中的应用及实现

文章目录 1. 引言2. Pure Pursuit在倒车场景的推导3. 模糊控制器的设计3.1 基础知识3.2 预瞄距离系数k的模糊控制器设计 4. 算法和仿真实现 1. 引言 Pure Pursuit是一种几何跟踪控制算法&#xff0c;也被称为纯跟踪控制算法。他的思想就是基于当前车辆的后轮中心的位置&#x…

Axure RP 9 for Mac/win:打造极致交互体验的原型设计神器

在数字化浪潮席卷全球的今天&#xff0c;原型设计作为产品开发的关键环节&#xff0c;其重要性不言而喻。Axure RP 9&#xff0c;作为一款专为设计师和开发者打造的原型设计软件&#xff0c;以其出色的交互设计能力和高效的协作体验&#xff0c;赢得了广大用户的青睐。 Axure …

【JavaScript】axios

基础使用 <script src"https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.min.js"></script> <script>axios.get(https://study.duyiedu.com/api/herolist).then(res> {console.log(res.data)}) </script>get - params <script s…

U盘乱码频发,原因与解决方案大揭秘

在日常的工作和生活中&#xff0c;U盘因其便携性和大容量成为了我们不可或缺的存储设备。然而&#xff0c;有时候我们会遭遇U盘乱码的问题&#xff0c;这让我们无法正确读取和使用其中的文件。那么&#xff0c;U盘乱码究竟是何原因导致的呢&#xff1f;又该如何解决这一问题呢&…

Python自学之路--002:Python 如何生成exe可执行文件

目录 1、概述 2、安装pyinstall 3、终端指令 1、概述 大部分时候&#xff0c;执行的仅仅是一个Python解释器出来的文件&#xff0c;至于怎么将文件生成exe的可执行文件呢&#xff1f;Python有对应的库&#xff0c;也就是pyinstall。安装之后产生dist文件夹&#xff0c;里面就…

UE5 GAS开发P34 游戏效果理论

GameplayEffects Attributes&#xff08;属性&#xff09;和Gameplay Tags&#xff08;游戏标签&#xff09;分别代表游戏中实体的特性和标识。 Attributes&#xff08;属性&#xff09;&#xff1a;Attributes是用来表示游戏中实体的特性或属性的值&#xff0c;例如生命值、…

ffmpeg的安装以及使用

1.FFmpeg 的主要功能和特性&#xff1a; 格式转换&#xff1a;FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP4、AVI、MKV、MOV、FLV、MP3、AAC 等。视频处理&#xff1a;FFmpeg 可以进行视频编码、解…

书生·浦语大模型开源体系(四)作业

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

云计算技术架构及发展

云计算是指一种将可伸缩、弹性、共享的物理和虚拟资源池以按需自服务的方式供应和管理&#xff0c;并提供网络访问的模式。 云计算服务商利用分布式计算和虚拟资源管理等技术&#xff0c;通过网络将分散的ICT资源集中起来形成共享的资源池&#xff0c;并以动态按需和可度量的方…

基于若依和flowable7.0.1的ruoyi-nbcio-plus流程管理系统正式发布

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…
最新文章