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

【数据结构】栈与队列(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)

在阅读该篇文章之前&#xff0c;可以先了解一下堆栈寄存器和栈帧的运作原理&#xff1a;<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹&#xff0c;最先装进去的子弹最后射出来&#xff0c;最后装入的子弹…...

vue.js -ref和$refs获取dom和组件

在Vue.js中&#xff0c;ref和$refs是两个常用的属性&#xff0c;用于访问DOM元素和组件实例。下面分别详细解析这两个属性&#xff0c;并提供代码实例。 ref属性 ref属性用于给DOM元素或组件指定一个唯一的引用标识&#xff0c;在Vue实例中可以通过这个标识来访问对应的DOM元素…...

unity学习5:创建一个自己的3D项目

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

IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案

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

计算机网络 (21)网络层的几个重要概念

前言 计算机网络中的网络层是OSI&#xff08;开放系统互连&#xff09;模型中的第三层&#xff0c;也是TCP/IP模型中的第二层&#xff0c;它位于数据链路层和传输层之间&#xff0c;负责数据包从源主机到目的主机的路径选择和数据转发。 一、网络层的主要功能 路由选择&#xf…...

企业网络性能监控

什么是网络性能监控 网络性能监控&#xff08;NPM&#xff09;是指对计算机网络的性能进行持续测量、分析和管理的过程&#xff0c;通过监控流量、延迟、数据包丢失、带宽利用率和正常运行时间等关键指标&#xff0c;确保网络高效、安全地运行&#xff0c;并将停机时间降至最低…...

halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型

目录 一、gen_robot_tool_and_base_object_model_3d 函数调用二、gen_arrow_object_model_3d 函数调用 首先说明一下这部分代码在find_box_3d这个例程中&#xff0c;非常好用的一个坐标系生成函数。 一、gen_robot_tool_and_base_object_model_3d 函数调用 RobotToolSize : 0.…...

容器技术思想 Docker K8S

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

25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)

python环境没有安装的可以点击这里先安装好python环境&#xff0c;python环境安装教程 安装 PyCharm IDE 获取 PyCharm PyCharm 提供两种主要版本——社区版&#xff08;免费&#xff09;和专业版&#xff08;付费&#xff09;。对于初学者和个人开发者而言&#xff0c;社区…...

Oracle job(定时任务)

1、job的作用 可以定时执行任务&#xff08;分/次、时/次、天/次等&#xff09; 2、创建job --创建job --注意点&#xff1a; --①job_no 为系统自动获取&#xff1b; --②存储过程名需要加‘&#xff1b;’ --③定时器开始执行时间可以填‘sysdate,表示立即执行 --④执行频…...

[python3]Excel解析库-xlwt

xlwt 是一个用于创建 Excel .xls 文件&#xff08;即旧版的 Excel 97-2003 格式&#xff09;的 Python 库。它允许你用 Python 编写程序来生成 Excel 文件&#xff0c;而不需要实际运行 Microsoft Excel 应用程序。请注意&#xff0c;xlwt 只支持写入 .xls 文件&#xff0c;并不…...

【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;trait的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#x…...

大数据高级ACP学习笔记(2)

钻取&#xff1a;变换维度的层次&#xff0c;改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub...

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令

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

【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值

一、简介 一般的数据库要素或表格都有一个BSM字段&#xff0c;用来标识唯一值。 此工具要实现的功能是&#xff1a;按一定的规律&#xff08;前缀中间的填充数字OBJECT码&#xff09;来给BSM赋值。 主要技术要点包括&#xff1a; 1、ProWindow的创建&#xff0c;Label,Comb…...

OpenCV轮廓相关操作API (C++)

在OpenCV中&#xff0c;轮廓&#xff08;contours&#xff09;是图像处理中的一个重要概念&#xff0c;通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API&#xff0c;可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContou…...

[开源]自动化定位建图系统

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

linux ansible部署

ansible部署完后&#xff0c;执行报错 # 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.枚举的定义和使用如下图所示&#xff1a; 定义时还可以给枚举的成员指定数据类型&#xff0c;例如&#xff1a;enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下&#xff0c;使用::进行分隔。 2.一个特殊的枚举Option&#xff0…...

Redis内存碎片

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

【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)

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

使用变异系数增强 CFD 收敛标准

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

汽车的安全性能测试:试验台铁地板的重要性

汽车的安全性能测试是非常重要的&#xff0c;其中试验台铁地板的设计和材料选择起着至关重要的作用。试验台铁地板是指在进行汽车碰撞、侧翻等试验时&#xff0c;用于支撑汽车底部和提供稳定支撑的重要部件。 在进行汽车碰撞试验时&#xff0c;试验台铁地板的设计和材料需要具…...

C#中的密封类与静态类:特性、区别与应用实例

深入解析两类特殊类的设计哲学与实战应用 在面向对象编程领域中&#xff0c;C#提供了多种特殊的类类型以满足不同设计需求。其中密封类&#xff08;sealed class&#xff09;和静态类&#xff08;static class&#xff09;是最常用的两种特殊类类型。本文将从设计理念、应用场…...

#开发环境篇: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刨析源码 具体使用界面设计具体函数使用初始化信号与槽函数&#xff08;两种方式&#xff09; 总结 前言 在练手项目中&#xff0c;使用了QButtonGroup。项目需求有互斥的要求&#xff0c;在使用QRadioButton的基础上&a…...

KAG与RAG在医疗人工智能系统中的多维对比分析

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

JAVA理论-JAVA基础知识

1.Java 基础 知识 1.1 面向对象的特征&#xff08;了解&#xff09; 面向对象的特征&#xff1a;封装、继承、多态、抽象 封装&#xff1a;就是把对象的属性和行为&#xff08;数据&#xff09;结合为一个独立的整体&#xff0c;并尽量隐藏对象的内部细节&#xff0c;公开我希…...

JMM初学

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