【数据结构】栈与队列(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;
	}
    //栈顶指针指向-1
    p->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;
	}
    //队头和队尾指针指向-1
    p->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");
}

综上。希望该内容能对你有帮助,感谢!

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

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

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

相关文章

python基础案例

#一个年份如果能被4整除但不能被 100整除&#xff0c;或能被 400整除&#xff0c;那么这个年份就是闰年。 year int(input(请输入年份&#xff1a;)) if (year %40 and year %100!0) or year %4000:print("这个年份就是闰年") else:print("这个年份不是闰…

微服务框架,Http异步编程中,如何保证数据的最终一致性

一、背景 在微服务框架下&#xff0c;跨服务之间的调用&#xff0c;当遇到操作耗时或者量大的情况&#xff0c;我们一般会采用异步编程实现。 本文出现的问题是&#xff1a;异步回调过来时&#xff0c;却未查询到数据库中的任务&#xff0c;导致未能正常处理回调。 下面是当…

Kafka详解 ③ | Kafka集群操作与API操作

目录 1、Kafka集群操作 1.1、创建 topic 1.2、查看主题命令 1.3、生产者生产 1.4、消费者消费数据 1.5、运行 describe topics命令 1.6、增加 topic分区数 1.7、增加配置 1.8、删除配置 1.9、删除 topic 2、Kafka的Java API操作 2.1、生产者代码 2.2、消费者代 2…

Echarts集成Vue2个人总结与反思

协同净焦水处理系统 统计模块 环境部署 1、创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&#xff09; 2、创建数据库ry-config并导入数据脚本ry_config_2021xxxx.sql&#xff08;必须&#xff09; …

aardio —— 虚表 —— 模拟属性框

写了个简单的属性框例程&#xff0c;抛砖引玉&#xff0c;期待你做出更丰富强大的功能。 本例演示&#xff1a;折叠子行、选择框、输入文本、输入数值、下拉选择、选择图片、选择颜色、选择字体等功能。 只有想不到&#xff0c;没有做不到&#xff0c;发挥你的想象力吧。 imp…

《Vue3 七》插槽 Slot

插槽可以让组件的使用者来决定组件中的某一块区域到底存放什么元素和内容。 使用插槽&#xff1a; 插槽的使用过程其实就是抽取共性、预留不同。将共同的元素、内容依然留在组件内进行封装&#xff1b;将不同的元素使用 slot 作为占位&#xff0c;让外部决定到底显示什么样的…

Functions

1.trigonometric function 定义和图像 反三角函数是三角函数的反函数 versin(verse -sin)&#xff1a;1/sinx 性质 三角函数的公式 三角恒等式 周期性公式&#xff1a;直接画图记 公式记忆&#xff1a;先想象一个在第一象限的锐角 1&#xff1a;在坐标轴中旋转360 2.sin&am…

微服务-网关、配置热更新、动态路由

祝小伙伴们每天开心 每天都能进步一点点 目录 1 网关路由 1.1 认识网关 什么是网关捏 网关实现方案 1.2 快速入门 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;配置路由 1.3 路由过滤 路由规则语法 常见属性 predicates&#xff08;路由断言&…

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…

机器学习基础-支持向量机SVM

目录 基本概念和定义 1. 超平面&#xff08;Hyperplane&#xff09; 2. 支持向量&#xff08;Support Vectors&#xff09; 3. 线性可分 4. 边界 SVM算法基本思想和分类 基本思想 间隔最大化 间隔&#xff08;Margin&#xff09; 软边距 SVM 核函数的概念 基本概念…

TypyScript从入门到精通

TypyScript从入门到精通 TypyScript 是什么&#xff1f;增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型&#xff1a;3.…

mybatisX插件的使用,以及打包成配置

装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己要的包和类&#xff1b; 如果要把自己的配置设置成一个自定义模板&a…

简单的jmeter数据请求学习

简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化&#xff0c;将wfms服务操作并入了workflow-server中&#xff0c;去除了原来的webservice服务调用形式&#xff0c;增加了并发处理&#xff0c;现在想测试模拟一下&#xff0c;在一…

Java后端常用的4种请求方式(通俗易懂)

文章目录 前言通用接口类(ControllerDemo)通用实体类(UserEntity)通用响应类(HttpClientResult)成功截图(先启动项目,然后右键执行main方法) HttpClientHttpClient 的主要类代码案例导入依赖工具类(HttpClientUtil)测试类 HttpURLConnection简介调用步骤代码案例导入依赖工具类…

floodfill算法_dfs

之前我们用BFS解决floodfil算法 BFS 解决 FloodFill 算法_图像渲染_岛屿数量_被围绕的区域-CSDN博客 下面我们用dfs进行解决 733. 图像渲染 从初始位置开始dfs&#xff0c;找和它值相同的&#xff0c;并在dfs过程中把值改为目标值。因为会改变原数组&#xff0c;不用vis记录经过…

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读&#xff1a; 多点 DMALL 成立于2015年&#xff0c;持续深耕零售业&#xff0c;为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座&#xff0c;大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程&#xff0c;实现开发板和超拟人大模型进行语音交互&#xff0c;支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人&#xff0c;如果当前SDK在v2.3.o以下&#xff0c;需要更新SDK。在SDK目录(duomotai_ap)下…

graylog+sidecar通过docker-compose部署并采集SSH登录日志

文章目录 前言一、graylog日志系统数据流向清洗图二、资源准备及部署1.docker-compose部署2.准备docker-compose.yml文件3.安装graylog-sidecar并配置4.给sidecar创建token 三、graylog-WEB配置采集SSH日志1.配置Inputs2.创建sidecar采集器3.将页面创建好的sidecar与服务器绑定…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 &#x1f914;在实际开发过程中&#xff0c;我遇到了一个颇为棘手的小问题 &#x1f60b;解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决&#xff01;​ &#x1f4d6;相关知识总结 基本概念 使用方法 实际应用场景 &#x1f914;在实际开发过程中…

2023年区块链职业技能大赛——区块链应用技术(一)模块一

模块一:区块链产品方案设计及系统运维: 任务1-1:区块链产品需求分析与方案设计 1.依据给定区块链食品溯源系统的业务架构图&#xff0c;对考题进行业务分析&#xff0c;可能多的去考虑一个业务系统所需要的模块&#xff0c;使用Visio或思维导图工具展现本系统的基本设计概念和…