顺序栈算法库构建

news2024/10/7 6:48:37

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

数据结构之自建算法库——顺序栈_设计一个主函数实现对顺序栈进行操作测试,测试方法,依次把元素-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.coloradmin.cn/o/1620373.html

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

相关文章

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

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

基于OpenCV+QT的人脸识别打卡项目

1.基本概念 基于OpenCV的人脸识别是一个多步骤的过程&#xff0c;通常涉及以下步骤&#xff1a; 人脸检测&#xff1a;使用Haar级联或深度学习模型来检测图像中的面部区域。OpenCV提供了预训练的Haar级联分类器&#xff0c;可以用于快速检测。 特征提取&#xff1a;一旦检测到…

如何快速学习盲打键盘的指法

学习盲打键盘的指法需要一定的时间和练习&#xff0c;但是以下几个方法可以帮助你加快学习的速度&#xff1a; 掌握正确的手位&#xff1a;了解标准的键盘布局以及手指应该放置的位置是学习盲打的第一步。在QWERTY键盘上&#xff0c;你的左手应该放在ASDF键上&#xff0c;右手应…

Win10 搭建 YOLOv8 运行环境(20240423)

一、环境要求 1、Python&#xff0c;版本要求>3.7 2、PyTorch&#xff0c;版本要求>1.7。PyTorch 是一个开源的深度学习平台&#xff0c;为人工智能研究提供了一个灵活的、易于使用的工具集。YOLOv8 是基于 PyTorch 框架实现的&#xff0c;所以需要安装 PyTorch。 3、CUD…

七分钟“手撕”三大特性<多态>

目录 一、学习多态之前需要的知识储备 二、重写 1.什么是重写 2.重写可以干嘛 3.怎么书写重写 4.重载与重写的区别 三、向上转型 1.什么是向上转型&#xff1f; 2.向上转型的语法 3.向上转型的使用场景 四、多态是什么 六、多态实现 七、多态的好处 八、多态的缺…

万兆以太网MAC设计(8)ICMP协议详解以及ICMP层模块设计

文章目录 前言&#xff1a;ICMP协议详解一、ICMP_RX模块二、ICMP_TX模块三、仿真总结 前言&#xff1a;ICMP协议详解 ICMP (Internet Control Message Protocol) 协议被设计用来向 IP 源端报告差错及其它相关信息, IP 协议本身只设置有 Checksum 机制来保证数据的正确性, 它本身…

个人搭建alist网盘的经验记录备忘

1、搭建宝塔LINUX面板&#xff0c;安装Docker 2、添加仓库 3、从镜像拉取xhofe/alist:latest 4、添加容器 5、新建一个网站&#xff0c;别忘记申请个SSL证书&#xff0c;重要的是反向代理 6、新建个mysql数据库 7、修改alist数据库的链接地址&#xff0c;方便自己备份&a…

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

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

第一讲 - Java入门

第一讲 - Java入门 文章目录 第一讲 - Java入门1. 人机交互1.1 什么是cmd&#xff1f;1.2 如何打开CMD窗口&#xff1f;1.3 常用CMD命令1.4 CMD练习1.5 环境变量 2. Java概述1.1 Java是什么&#xff1f;1.2下载和安装1.2.1 下载1.2.2 安装1.2.3 JDK的安装目录介绍 1.3 HelloWor…

python——飞机大战游戏(下载模块,知识点,图片)

飞机大战——准备工作 这篇文章我们只有关于pygame模块的下载&#xff0c;和一些知识点&#xff0c;还有飞机大战我们需要用到的图片。下一篇文章我们进行代码的详细解析。 1.1安装pygame模块 方法一&#xff1a; 在pycharm中打开命令行下载&#xff0c;输入pip install py…

Axure设计美观友好的后台框架页

使用Axure设计后台框架页 优点介绍&#xff1a; **1、使用中继器灵活配置菜单项&#xff1b; 2、二级菜单面板跟随一级菜单位置显示&#xff1b; 3、菜单链接打开后&#xff0c;联动添加tab标签&#xff1b; 4、标签页与iframe内容联动&#xff0c;可关闭&#xff1b; 5、左侧…

linux 定位进程文件路径

有时候用top 打开任务管理器时知道某个任务的进程的存在&#xff0c;但不知道是哪个文件&#xff0c;只需两条指令只可定位进程的可执行文件路径 使用 ls -l /proc/<PID>/cwd 命令来查找该进程的当前工作目录。使用 cat /proc/<PID>/cmdline 命令来查看该进程的命…

富集分析不求人,零代码可视化GO/KEGG分析结果

01 爱基百客云平台小工具使用 首先&#xff0c;打开爱基百客官网&#xff1a;http://www.igenebook.com&#xff1b;点击菜单栏最右侧“云平台”按钮。 弹出云平台界面&#xff08;下图&#xff09;&#xff0c;输入账号、密码和验证码方可登录&#xff1b;进入云平台&#xf…

ThingsBoard服务端使用RPC通过网关给设备发送消息

一、概述 1、发送服务器端网关RPC 二、案例&#xff1a; 1、建立设备与网关之间的通讯 2、查看设备和网关是否在线状态啊 3、通过 仪表盘&#xff0c;创建设备A的模拟RPC调用的窗口链接 4、在客户端的网关设备上订阅RPC网关的主题信息 5、通过服务端的窗口&#xff0c;发…

JavaEE >> Spring(2)

前面已经介绍了 Spring 的基本使用以及创建&#xff0c;本文将介绍使用注解的方式实现对 Spring 更简单的存储对象和读取对象. 将对象存储到 Spring 中 创建 Spring 项目 前面已经做过详细步骤&#xff0c;此处不再赘述. 链接在此 Spring 基本使用及创建 pom.xml 和 Spring…

机器学习模型效果不好及其解决办法

当训练出来的机器学习模型效果不佳时&#xff0c;可能涉及多个方面的原因。为了改善模型的效果&#xff0c;需要系统地检查和分析问题的根源&#xff0c;并采取相应的措施进行优化。 一、数据问题 数据质量 检查数据是否干净、完整&#xff0c;是否存在噪声、异常值或缺失值。…

【后端】python2和python3的安装与配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、python是什么二、python环境的安装与配置Python 2的安装与配置Python 3的安装与配置注意事项 三、总结 前言 随着开发语言及人工智能工具的普及&#xff0…

C++ //练习 13.17 分别编写前三题中所描述的numbered和f,验证你是否正确预测了输出结果。

C Primer&#xff08;第5版&#xff09; 练习 13.17 练习 13.17 分别编写前三题中所描述的numbered和f&#xff0c;验证你是否正确预测了输出结果。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************…

git提交注释规范插件

1、前言 为什么要注重代码提交规范&#xff1f; 在团队协作开发时&#xff0c;每个人提交代码时都会写 commit message。 每个人都有自己的书写风格&#xff0c;翻看我们组的git log, 可以说是五花八门&#xff0c;十分不利于阅读和维护。 一般项目开发都是多分支共存&#x…

浅涉ROS世界中的坐标系及其他

声明&#xff1a;文中图片素材均采用了其他博主文章&#xff08;文末参考来源&#xff09;&#xff0c;如有侵权或不妥&#xff08;确有不妥和不安&#xff0c;奈何苦于佳图难觅&#xff09;&#xff0c;还望告知&#xff0c;立即删除&#xff01; 坐标系统 ROS中的…