【数据结构】栈与队列(FIFO)
在阅读该篇文章之前,可以先了解一下堆栈寄存器和栈帧的运作原理:<【操作系统】堆栈寄存器sp详解以及栈帧>。
栈(FILO)
特性: 栈区的存储遵循着先进后出的原则。
例子: 枪的弹夹,最先装进去的子弹最后射出来,最后装入的子弹最先射出来。
操作:
- 初始化
- 入栈
- 出栈
- 遍历
分类:
- 顺序栈
- 通过数组与栈顶指针实现。
- 链栈
- 通过链表与栈顶指针实现。
顺序栈
#define N 5
#define datatype int
typedef struct stack{datatype arr[N]; //栈的数组datatype top; //栈的栈顶指针
}stack_t;
1> 初始化stack_init
stack_t *stack_init(void)
{//堆stack_t *p = (stack_t *)malloc(sizeof(stack_t));if(NULL == p){perror("malloc");return NULL;}//栈顶指针指向-1p->top = -1;return p;
}
2> 入栈push
int push(stack_t *p,datatype d)
{//判断栈是否已满if(p->top == N-1){printf("酒店(栈)满了..\n");return -1;}//栈顶指针+1和存入数据p->arr[p->++top] = d;return 0;
}
3> 出栈pop
int pop(stack_t *p,datatype *d) //这样就能使外面的变量改变
{//先判断栈是否空if(p->top == -1){printf("酒店人都不在了..\n");return -1; }//将数据取出来并栈顶指针减1*d = p->arr[p->top--];return 0;
}
4> 遍历display
void display(stack_t *p)
{for(int i=p->top;i>=0;i--) //先进后出{printf("| %d |",p->arr[i]);}printf("\n");
}
链栈
#define datatype int
typedef struct stack{struct stack *next; //下一个地址datatype data; //链栈的数据域
}stack_t;
1> 入栈push
int push(stack_t **top,datatype d) //二级指针
{//1>创建新结点stack_t *node = (stack_t *)malloc(sizeof(stack_t));if(NULL == p){perror("malloc");return -1;}//2>next指针域指向top指向的地址node->data = d;node->next = (*top); //3>让top指向新入栈的结点的地址(*top) = node;return 0;
}
2> 遍历display
void display(stack_t *top)
{//遍历while(top != NULL){printf("| %d |\n",top->data);top = top->next;}printf("\n");
}
3> 出栈pop
int pop(stack_t **top,datatype *d)
{//1>判断链栈是否空if((*top)== NULL){printf("链栈为空\n");return -1;}//2>中间变量保存要删除的地址stack_t *temp = (*top);//3>top往栈底方向移动(*top) = (*top)->next;//数据传出(*d) = temp->data;//4>删除与释放temp->next = NULL;free(temp);return 0;
}
队列(FIFO)
“FILO(先进后出)”,这其实是栈的特点,而不是队列的特性。
特性:先进先出
分类:
- 顺序队列(顺序循环队列)
- 链式队列
顺序队列
1> 初始化queue_init
queue_t *queue_init(void)
{//堆queue_t *p = (queue_t *)malloc(sizeof(queue_t));if(NULL == p){perror("malloc");return NULL;}//队头和队尾指针指向-1p->head = -1;p->tail = -1;return p;
}
2> 入队push
//入队
int push(queue_t *p,datatype d)
{//判断队列是否已满if(p->tail == N-1){printf("队列满了..\n");return -1;}//队尾指针+1和存入数据p->arr[++p->tail] = d;return 0;
}
3> 出队pop
//出队
int pop(queue_t *p,datatype *d) //这样就能使外面的变量改变
{//先判断队列是否空if(p->head == p->tail){printf("队列中没有数据..\n");return -1; }//将数据取出来并栈顶指针减1*d = p->arr[++p->head];return 0;
}
4> 遍历display
void display(queue_t *p)
{for(int i=p->head+1;i<=p->tail;i++) //先进先出{printf("| %d |\n",p->arr[i]);}printf("\n");
}
顺序循环队列
1> 初始化
queue_t *queue_init(void)
{//堆queue_t *p = (queue_t *)malloc(sizeof(queue_t));if(NULL == p){perror("malloc");return NULL;}//队头和队尾指针指向-1 //修改处p->head = N-1;p->tail = N-1;return p;
}
2> 入队
int push(queue_t *p,datatype d)
{//判断队列是否已满 //修改处 牺牲一个空间 区分队空if((p->tail+1)%N == p->head){printf("队列满了..\n");return -1;}//队尾指针+1 ,取余目的是循环使用空间p->tail = (p->tail+1)%N;//存入数据p->arr[p->tail] = d;return 0;
}
3> 出队
int pop(queue_t *p,datatype *d) //这样就能使外面的变量改变
{//先判断队列是否空if(p->head == p->tail){printf("队列中没有数据..\n");return -1; }//将队头指针+1,并取余p->head = (p->head+1)%N;//将数据取出*d = p->arr[p->head];return 0;
}
4> 遍历
void display(queue_t *p)int i; //修改处for(i=(p->head+1)%N;i!=(p->tail+1)%N;i=(i+1)%N) //先进先出{printf("| %d |\n",p->arr[i]);}printf("\n");
}
综上。希望该内容能对你有帮助,感谢!
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:

【数据结构】栈与队列(FIFO)
在阅读该篇文章之前,可以先了解一下堆栈寄存器和栈帧的运作原理:<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹,最先装进去的子弹最后射出来,最后装入的子弹…...
vue.js -ref和$refs获取dom和组件
在Vue.js中,ref和$refs是两个常用的属性,用于访问DOM元素和组件实例。下面分别详细解析这两个属性,并提供代码实例。 ref属性 ref属性用于给DOM元素或组件指定一个唯一的引用标识,在Vue实例中可以通过这个标识来访问对应的DOM元素…...

unity学习5:创建一个自己的3D项目
目录 1 在unity里创建1个3D项目 1.1 关于选择universal 3d,built-in render pipeline的区别 1.2 创建1个universal 3d项目 2 打开3D项目 2.1 准备操作面板:操作界面 layout,可以随意更换 2.2 先收集资源:打开 window的 AssetStore 下载…...

IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案
IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案 问题描述 在IEEE PDF eXpress上上传论文后,出现Font XXX is not embedded的问题。 该问题是指你所插入的图片等,没有将对应的字体嵌入进去。 解决方案 以下以Origin Lab图片…...

计算机网络 (21)网络层的几个重要概念
前言 计算机网络中的网络层是OSI(开放系统互连)模型中的第三层,也是TCP/IP模型中的第二层,它位于数据链路层和传输层之间,负责数据包从源主机到目的主机的路径选择和数据转发。 一、网络层的主要功能 路由选择…...

企业网络性能监控
什么是网络性能监控 网络性能监控(NPM)是指对计算机网络的性能进行持续测量、分析和管理的过程,通过监控流量、延迟、数据包丢失、带宽利用率和正常运行时间等关键指标,确保网络高效、安全地运行,并将停机时间降至最低…...
halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型
目录 一、gen_robot_tool_and_base_object_model_3d 函数调用二、gen_arrow_object_model_3d 函数调用 首先说明一下这部分代码在find_box_3d这个例程中,非常好用的一个坐标系生成函数。 一、gen_robot_tool_and_base_object_model_3d 函数调用 RobotToolSize : 0.…...

容器技术思想 Docker K8S
容器技术介绍 以Docker为代表的容器技术解决了程序部署运行方面的问题。在容器技术出现前,程序直接部署在物理服务器上,依赖管理复杂,包括各类运行依赖,且易变,多程序混合部署时还可能产生依赖冲突,给程序…...

25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)
python环境没有安装的可以点击这里先安装好python环境,python环境安装教程 安装 PyCharm IDE 获取 PyCharm PyCharm 提供两种主要版本——社区版(免费)和专业版(付费)。对于初学者和个人开发者而言,社区…...
Oracle job(定时任务)
1、job的作用 可以定时执行任务(分/次、时/次、天/次等) 2、创建job --创建job --注意点: --①job_no 为系统自动获取; --②存储过程名需要加‘;’ --③定时器开始执行时间可以填‘sysdate,表示立即执行 --④执行频…...
[python3]Excel解析库-xlwt
xlwt 是一个用于创建 Excel .xls 文件(即旧版的 Excel 97-2003 格式)的 Python 库。它允许你用 Python 编写程序来生成 Excel 文件,而不需要实际运行 Microsoft Excel 应用程序。请注意,xlwt 只支持写入 .xls 文件,并不…...

【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 题外话:trait的概念非常非常非常重要!!!整个第10章全都是Rust的重难点!&#x…...

大数据高级ACP学习笔记(2)
钻取:变换维度的层次,改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub...

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令
K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台;我这里是安装的其他开…...

【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值
一、简介 一般的数据库要素或表格都有一个BSM字段,用来标识唯一值。 此工具要实现的功能是:按一定的规律(前缀中间的填充数字OBJECT码)来给BSM赋值。 主要技术要点包括: 1、ProWindow的创建,Label,Comb…...
OpenCV轮廓相关操作API (C++)
在OpenCV中,轮廓(contours)是图像处理中的一个重要概念,通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API,可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContou…...

[开源]自动化定位建图系统
系统状态机: 效果展示: 1、 机器人建图定位系统-基础重定位,定位功能演示 2、 机器人建图定位系统-增量地图构建,手动回环检测演示 3、敬请期待… 开源链接: 1、多传感器融合里程计 https://gitee.com/li-wenhao-lw…...

linux ansible部署
ansible部署完后,执行报错 # ansible one -i hosts -m ping dataos193 | FAILED! > {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add …...

《Rust权威指南》学习笔记(二)
枚举enum 1.枚举的定义和使用如下图所示: 定义时还可以给枚举的成员指定数据类型,例如:enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下,使用::进行分隔。 2.一个特殊的枚举Option࿰…...

Redis内存碎片
什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数…...

【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)
CEEMDAN联合小波阈值去噪算法相关文献 一、EMD 与 EEMD 的局限性 (1)EMD (经验模态分解) 旨在自适应地将非线性、非平稳信号分解成一系列 本征模态函数 (IMFs),这些 IMFs 从高频到低频排列。 核心问题:模态混合 (Mode Mixing) 同…...

使用变异系数增强 CFD 收敛标准
将描述性统计整合到 CFD 中,以评估可变性和收敛性。 挑战 在工程设计中,尤其是在进行仿真时,我们经常处理描述流体、温度、应力或浓度行为的大型数据集。以有意义的方式解释这些值需要的不仅仅是原始数字;它需要对统计的理解。 统计学在工程…...

汽车的安全性能测试:试验台铁地板的重要性
汽车的安全性能测试是非常重要的,其中试验台铁地板的设计和材料选择起着至关重要的作用。试验台铁地板是指在进行汽车碰撞、侧翻等试验时,用于支撑汽车底部和提供稳定支撑的重要部件。 在进行汽车碰撞试验时,试验台铁地板的设计和材料需要具…...
C#中的密封类与静态类:特性、区别与应用实例
深入解析两类特殊类的设计哲学与实战应用 在面向对象编程领域中,C#提供了多种特殊的类类型以满足不同设计需求。其中密封类(sealed class)和静态类(static class)是最常用的两种特殊类类型。本文将从设计理念、应用场…...
#开发环境篇:postMan可以正常调通,但是浏览器里面一直报403
本地header代理下面内容即可 headers: { // 添加必要的请求头 ‘Host’: ‘服务端域名’, ‘Origin’: https://服务端域名, ‘Referer’: https://服务端域名 }, devServer: {// 本地开发代理API地址proxy: {^/file: {target: https://服务端域名,changeOrigin: true, // 是否…...
VMware 安装 CentOS8详细教程 (附步骤截图)附连接公网、虚拟机yum源等系统配置
1 下载安装镜像 centos8官方源已下线,旧的下载地址已不可用,需要切换centos-vault源 华为云CentOS8镜像下载地址 阿里云CentOS8镜像下载地址 中科大CentOS8镜像下载地址 2 安装CentOS8 2.1 创建虚拟机 打开VMware Workstation 左上角 文件-新建虚拟机...

Qt/C++学习系列之QButtonGroup的简单使用
Qt/C学习系列之QButtonGroup的简单使用 前言QButtonGroup刨析源码 具体使用界面设计具体函数使用初始化信号与槽函数(两种方式) 总结 前言 在练手项目中,使用了QButtonGroup。项目需求有互斥的要求,在使用QRadioButton的基础上&a…...

KAG与RAG在医疗人工智能系统中的多维对比分析
1、引言 随着人工智能技术的迅猛发展,大型语言模型(LLM)凭借其卓越的生成能力在医疗健康领域展现出巨大潜力。然而,这些模型在面对专业性、时效性和准确性要求极高的医疗场景时,往往面临知识更新受限、事实准确性不足以及幻觉问题等挑战。为解决这些问题,检索增强生成(…...

JAVA理论-JAVA基础知识
1.Java 基础 知识 1.1 面向对象的特征(了解) 面向对象的特征:封装、继承、多态、抽象 封装:就是把对象的属性和行为(数据)结合为一个独立的整体,并尽量隐藏对象的内部细节,公开我希…...

JMM初学
文章目录 1,线程间的同步和通信1.1, 共享内存并发模型 (Shared Memory Model)线程通信机制线程同步机制特点 1.2, 消息传递并发模型 (Message Passing Model)线程通信机制线程同步机制特点 适用场景对比 2,Java内存模型JMM2.0,Java内存模型的基础(1)内存…...