当前位置: 首页 > news >正文

4、数据结构与算法解析(C语言版)--栈

栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。

1、创建项目

 main.h

#ifndef _MAIN_H
#define _MAIN_H#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1   // 无意义 
#define OVERFLOW -2typedef int Status;
typedef int ElemType;
typedef int SElemType;#endif 

main.c

#include "Stack.h"/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) {Stack_test();	return 0;
}

Stack.h

#ifndef _STACK_H
#define _STACK_H#include "main.h"void Stack_test(void);#endif

Stack.c

#include "Stack.h"void Stack_test(void)
{}

2、创建栈结构

#ifndef _STACK_H
#define _STACK_H#include "main.h"#define STACK_INT_SIZE 10  // 栈初始容量为10 
#define STACK_INCREMENT 2  // 空间不够每次增加两个 // 栈结构类型
typedef struct 
{SElemType *base;   // 栈底指针,栈构造和销毁后为NULLSElemType *top;   // 栈顶指针int stacksize;    // 当前栈的容量,分配的空间数		
}SqStack;void Stack_test(void);#endif

3、初始化栈

// 初始化栈 
// - 在函数内部修改外部栈空间的base、top、stacksize因此需要传入外部栈空间地址
void InitStack(SqStack *s) 
{s->base = (SElemType *)malloc(STACK_INT_SIZE *sizeof(SElemType));if(!s->base){printf("申请栈空间失败\r\n");exit(OVERFLOW);}s->top = s->base;s->stacksize = 0;
} 

测试代码:

void Stack_test(void)
{SqStack st;InitStack(&st);
}

4、向栈中添加元素

// 向栈中添加元素
// - 在函数内部修改外部栈空间的base、top、stacksize因此需要传入外部栈空间地址
void Push(SqStack *s,SElemType e) 
{if(s->top - s->base == s->stacksize ){// 栈满SElemType *temp;temp =  (SElemType *)realloc(s->base,(s->stacksize + STACK_INCREMENT)*sizeof(SElemType));if(!temp){printf("申请栈空间失败\r\n");exit(OVERFLOW);}s->base = temp; // 申请成功,修改s->base指向s->top = s->base + s->stacksize;  // 更改新的top指针指向s->stacksize +=  STACK_INCREMENT;		}// 将元素推入栈中 *(s->top) = e;// 栈顶指针移动 (s->top)++; 
}

5、访问栈数据

// 访问栈数据
void StackTraverse(SqStack s)
{SElemType *p = s.base;while(p < s.top){printf("%d ",*p);p++;}printf("\n");
} 

测试代码:

void Stack_test(void)
{SqStack st;InitStack(&st);int i = 0;for(i=1;i<8;i++){Push(&st,i);}StackTraverse(st);
}

 6、获取栈顶元素不移除

Status GetTop(SqStack s,SElemType *e)
{if(s.top > s.base){// 栈不为空*e = *(s.top-1); return OK;}return ERROR;
}

测试代码: 

void Stack_test(void)
{SqStack st;InitStack(&st);int i = 0;for(i=1;i<8;i++){Push(&st,i);}printf("栈中元素有:"); StackTraverse(st);SElemType res;GetTop(st,&res);printf("栈顶元素:%d\n",res);	}

7、移除栈顶元素

// 移除栈顶元素
// 接收栈顶数据到外部空间中
Status Pop(SqStack s,SElemType *e) 
{if(s.top == s.base) {return ERROR;}--(s.top);*e = *(s.top);return OK;
}

测试代码:

void Stack_test(void)
{SqStack st;InitStack(&st);int i = 0;for(i=1;i<8;i++){Push(&st,i);}printf("栈中元素有:"); StackTraverse(st);SElemType res;Pop(st,&res);printf("移除的栈顶元素:%d\n",res);	}

8、获取栈的数据长度

// 获取栈的数据长度
int StackLength(SqStack s) 
{return s.top - s.base;
}

测试代码:

void Stack_test(void)
{SqStack st;InitStack(&st);int i = 0;for(i=1;i<8;i++){Push(&st,i);}printf("栈中元素有:"); StackTraverse(st);int res = StackLength(st);printf("当前栈的长度是:%d\n",res);}

9、空栈判断

// 空栈判断
Status StackEmpty(SqStack s)
{if(s.top == s.base){return TRUE;}else{return FALSE;}
} 

测试代码:

void Stack_test(void)
{SqStack st;InitStack(&st);int i = 0;for(i=1;i<8;i++){Push(&st,i);}printf("栈中元素有:"); StackTraverse(st);int res = StackLength(st);printf("当前栈的长度是:%d\n",res);Status res1 = StackEmpty(st);if(res1){printf("栈为空\n");}else{printf("栈不为空\n");}}

10、将栈设置为空

// 将栈设置为空
void ClearStack(SqStack *s) 
{s->top = s->base;
}

测试代码:

void Stack_test(void)
{SqStack st;InitStack(&st);int i = 0;for(i=1;i<8;i++){Push(&st,i);}printf("栈中元素有:"); StackTraverse(st);printf("清空栈中数据开始 ---- \n");ClearStack(&st);printf("清空栈中数据结束 ---- \n");int len = StackLength(st);printf("清空后栈的长度是:%d\n",len); }

11、销毁栈空间

// 销毁栈空间
void DestoryStack(SqStack *s) 
{free(s->base);s->top = NULL;s->base = NULL;s->stacksize = 0;
}

测试代码:

void Stack_test(void)
{SqStack st;InitStack(&st);int i = 0;for(i=1;i<8;i++){Push(&st,i);}printf("栈中元素有:"); StackTraverse(st);printf("销毁栈空间开始 ---- \n");DestoryStack(&st);printf("销毁栈空间结束 ---- \n");int len = StackLength(st);printf("清空后栈的长度是:%d\n",len); }

注意写的所有函数记得在Stack.h中进行声明。

#ifndef _STACK_H
#define _STACK_H#include "main.h"#define STACK_INT_SIZE 10  // 栈初始容量为10 
#define STACK_INCREMENT 2  // 空间不够每次增加两个 // 栈结构类型
typedef struct 
{SElemType *base;   // 栈底指针,栈构造和销毁后为NULLSElemType *top;   // 栈顶指针int stacksize;    // 当前栈的容量,分配的空间数		
}SqStack;void Stack_test(void);
void InitStack(SqStack *sp) ;
void Push(SqStack *sp,SElemType e);
void StackTraverse(SqStack s);
Status Pop(SqStack s,SElemType *e) ;
int StackLength(SqStack s) ;
Status StackEmpty(SqStack s);
void ClearStack(SqStack *s) ;
void DestoryStack(SqStack *s); #endif

相关文章:

4、数据结构与算法解析(C语言版)--栈

栈的数据存储遵循“后进先出的规则”&#xff0c;这在计算机里面是非常有用的&#xff0c;比如word等编辑软件的"撤销"功能&#xff0c;就是使用栈进行实现的。 1、创建项目 main.h #ifndef _MAIN_H #define _MAIN_H#include <stdio.h> #include <stdlib.…...

c# 后台任务自动执行

如果有些任务需要在后台自动执行&#xff0c;且时不时需要添加一个任务&#xff0c;且按照优先级顺序执行&#xff0c;那么可以参考本文的方法。 后台任务类 定义一个后台任务类BackgroundTaskThread&#xff0c;其中Start方法是用来启动任务的&#xff0c;循环查询是否有添加…...

被裁20240927 --- 嵌入式硬件开发 前篇

前篇主要介绍一些相关的概念&#xff0c;用于常识扫盲&#xff0c;后篇开始上干货&#xff01; 他捧着一只碗吃过百家的饭 1. 处理器芯片1.1 处理器芯片制造商一、 英特尔&#xff08;Intel&#xff09;二、 三星&#xff08;SAMSUNG&#xff09;三、 高通&#xff08;Qualcomm…...

重温设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…...

vulnhub靶场——Log4j2

第一步:搭建靶场环境 #开启环境 cd vulhub/log4j/CVE-2021-44228 docker-compose up -d 来到网站首页 第二步:搭建一个dnslog平台上获取我们注入的效果 第三步:发现 /solr/admin/cores?action 这里有个参数可以传 我们可以看到留下了访问记录并且前面的参数被执行后给我们回…...

Vue3中使用resolve进行路径别名设置

Vue3中使用resolve进行路径别名设置 使用Vite初始化Vue3项目工程请参考文章&#xff1a;Vite创建Vue3工程并引入ElementPlus&#xff08;图文详细&#xff09; 1.使用~路径别名替换根目录&#xff0c;使用路径别名替换src目录 在vite.config.js配置文件下添加如下配置 impo…...

Linux 添加磁盘

1、编辑虚拟机添加磁盘 然后开启虚拟机 选项如下&#xff1a; DOS (MBR) a 切换可引导标志 b 编辑嵌套的 BSD 磁盘标签 c 切换 DOS 兼容标志 通用 d 删除一个分区 F 列出未分配的空闲空间 l 列出已知的分区类型 n 添加一个新分区 p 打印分区表 t 更改分区类…...

集成 jacoco 插件,查看单元测试覆盖率

文章目录 前言集成 jacoco 插件&#xff0c;查看单元测试覆盖率1. 添加pom2. 配置完成、执行扫描3. 执行结果4. 单元测试报告 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞…...

MySQL purged gtid是如何生成和维护的

目录 1. GTID的基本概念2. GTID的生成3. GTID的清除3.1 手动清除二进制日志3.2 自动清除二进制日志3.3 重置主库 在MySQL中&#xff0c;gtid_purged表示已清除的GTID集合。 gtid_purged的生成和维护过程如下&#xff1a; 1. GTID的基本概念 GTID&#xff08;Global Transact…...

[创业之路-206]:《华为战略管理法-DSTE实战体系》- 6-关键成功因素法CSF

目录 一、概述 1、定义与起源 2、关键成功因素的定义 3、关键成功因素的来源 4、关键成功因素的确认方法 5、关键成功因素法的步骤 6、关键成功因素法的应用 7、关键成功因素法的优势与局限性 二、 关键成功因素法CSF的应用 1、企业战略管理 2、项目管理 3、绩效管…...

[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算

在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…...

目标检测——基于yolov8和pyqt的螺栓松动检测系统

目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…...

【Java数据结构】LinkedList

认识LinkedList LinkedList就是一个链表&#xff0c;它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来&#xff0c;所以不需要数组。LinkedList也是以泛型的方法实现的&#xff0c;所以使用这个类都需要实例化对象。 链表分为很多种&#xff0c;比…...

图像处理-Ch4-频率域处理

Ch4 频率域处理(Image Enhancement in Frequency Domain) FT &#xff1a;将信号表示成各种频率的正弦信号的线性组合。 频谱&#xff1a; ∣ F ( u , v ) ∣ [ R 2 ( u , v ) I 2 ( u , v ) ] 1 2 |F(u, v)| \left[ R^2(u, v) I^2(u, v) \right]^{\frac{1}{2}} ∣F(u,v)…...

WPS工具栏灰色怎么办

WPS离线不登录&#xff0c;开启工具栏等相关功能 当你在使用WPS的过程中&#xff0c;若因网络问题或其他特殊原因&#xff0c;导致无法登录使用WPS时&#xff0c;可根据以下步骤开启离线兼容模式&#xff0c;开启此模式后&#xff0c;可在未登录的状态下&#xff0c;激活并使用…...

渐开线齿轮和摆线齿轮有什么区别?

摆线齿形与渐开线齿形的区别 虽然在比对这两种齿形&#xff0c;但有一个事情希望大家注意&#xff1a;渐开线齿轮只是摆线齿轮的一个特例。 &#xff08;1&#xff09;摆线齿形的压力角在啮合开始时最大&#xff0c;在齿节点减小到零&#xff0c;在啮合结束时再次增大到最大…...

vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)

扫描出ip为192.168.121.161 访问该ip&#xff0c;发现只是一个静态页面什么也没有 使用dir dirsearch 御剑都只能扫描到/robots.txt /server-status 两个页面&#xff0c;前者提示我们什么也没有&#xff0c;后面两个没有权限访问 扫描端口&#xff0c;存在81端口 访问&#x…...

应用高次、有理代数式为AI生成亚对称图像

原创&#xff1a;daode1212(daode3056) 本文定义不完全对称的图像叫亚对称图像&#xff0c;因为全对称的太过机械&#xff0c;不符合人工的特点&#xff0c;本人基于二元高次的有理式&#xff0c;生成时引入N个随机数分A,B两个组&#xff0c;再通过指针对画布所有像素高速扫描生…...

潜在狄利克雷分配LDA 算法深度解析

引言 潜在狄利克雷分配&#xff08;Latent Dirichlet Allocation, LDA&#xff09;是一种广泛应用于文本挖掘和信息检索领域的主题模型。它能够从文档集合中自动发现隐藏的主题结构&#xff0c;为理解大规模文本数据提供了强有力的工具。本文将着重讲解 LDA 的核心理论&#x…...

[x86 ubuntu22.04]双触摸屏的触摸事件都响应在同一个触摸屏上

1 问题描述 CPU&#xff1a;G6900E OS&#xff1a;ubuntu22.04 Kernel&#xff1a;6.8.0-49-generic 系统下有两个一样的 edp 触摸屏&#xff0c;两个触摸屏的触摸事件都响应在同一个 edp 屏幕上。 2 解决过程 使用“xinput”命令查看输入设备&#xff0c;可以看到只有一个 to…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...