学习记录——day17 数据结构 队列 链式队列

队列介绍

1、队列也是操作受限的线性表:所有操作只能在端点处进行,其删除和插入必须在不同端进行

2、允许插入操作的一端称为队尾,允许删除操作的一端称为队头

3、特点:先进先出(FIFO)

4、分类:

        顺序存储的栈称为顺序栈

        链式存储的队列,称为链式队列

顺序队列

1、使用一片连续存储的空间存储队列,并且给定两个变量,分别记录队头和队尾下标

2、普通顺序队列使用中,存在“假溢满”现象

        假溢满:队列中明明还有存储空间,但是由于队尾已经达到了数组的最大下标,不能在继续                          入队元素了

3、为了解决“假溢满”现象,我们引入了循环顺序队列

循环顺序队列

循环顺序队列:通过相关操作,当对头或队尾达到数组最大下标时,可以返回到下标为0的位置

1、创建

SeqQueuePtr queue_create()
{SeqQueuePtr Q = (SeqQueuePtr)malloc(sizeof(SeqQueue)*MAX);if(NULL == Q){return NULL;}bzero(Q->data,sizeof(Q->data));Q->front = Q->tail = 0;printf("创建成功 \n");return Q;
}

2、判空判满

int queue_empty(SeqQueuePtr Q)
{return Q->tail == Q->front;
}int queue_full(SeqQueuePtr Q)
{return (Q->tail+1)%MAX == Q->front;
}

3、插入

void queue_push(SeqQueuePtr Q ,datatype e)
{if (NULL == Q || queue_full(Q)){return;}Q->data[Q->tail] = e;Q->tail = (Q->tail+1)%MAX;return;
}

4、遍历

void queue_show(SeqQueuePtr Q)
{if (NULL == Q){return;}printf("遍历结果:");for (int i = Q->front; i !=Q->tail; i=(i+1)%MAX){printf("%d\t",Q->data[i]);}putchar(10);return;
}

5、出队

void queue_pop(SeqQueuePtr Q)
{if (NULL == Q || queue_empty(Q)){return;}printf("%d 出队\n",Q->data[Q->front]);Q->front = (Q->front+1)%MAX;
}

6、求实际大小

int queue_size(SeqQueuePtr Q)
{if (NULL == Q){return -1;}//不使用循环求大小int size = ((Q->tail-Q->front)+MAX)%MAX;return size;
}

7、销毁

void queue_destroy(SeqQueuePtr Q)
{if (NULL != Q){free(Q);Q = NULL;}printf("boom!!\n");return;
}

8、完整代码

dui_lie.h

#ifndef DUI_LEI
#define DUI_LEI#include <myhead.h>#define MAX 8
typedef int datatype;typedef struct 
{datatype data[MAX];int front;int tail;
}SeqQueue,*SeqQueuePtr;SeqQueuePtr queue_create();int queue_empty(SeqQueuePtr Q);int queue_full(SeqQueuePtr Q);void queue_push(SeqQueuePtr Q ,datatype e);void queue_show(SeqQueuePtr Q);void queue_pop(SeqQueuePtr Q);int queue_size(SeqQueuePtr Q);void queue_destroy(SeqQueuePtr Q);#endif // !DUI_LEI.H

dui_lie.c

#include "dui_lie.h"
#include <myhead.h>SeqQueuePtr queue_create()
{SeqQueuePtr Q = (SeqQueuePtr)malloc(sizeof(SeqQueue)*MAX);if(NULL == Q){return NULL;}bzero(Q->data,sizeof(Q->data));Q->front = Q->tail = 0;printf("创建成功 \n");return Q;
}int queue_empty(SeqQueuePtr Q)
{return Q->tail == Q->front;
}int queue_full(SeqQueuePtr Q)
{return (Q->tail+1)%MAX == Q->front;
}void queue_push(SeqQueuePtr Q ,datatype e)
{if (NULL == Q || queue_full(Q)){return;}Q->data[Q->tail] = e;Q->tail = (Q->tail+1)%MAX;return;
}void queue_show(SeqQueuePtr Q)
{if (NULL == Q){return;}printf("遍历结果:");for (int i = Q->front; i !=Q->tail; i=(i+1)%MAX){printf("%d\t",Q->data[i]);}putchar(10);return;
}void queue_pop(SeqQueuePtr Q)
{if (NULL == Q || queue_empty(Q)){return;}printf("%d 出队\n",Q->data[Q->front]);Q->front = (Q->front+1)%MAX;
}int queue_size(SeqQueuePtr Q)
{if (NULL == Q){return -1;}//不使用循环求大小int size = ((Q->tail-Q->front)+MAX)%MAX;return size;
}void queue_destroy(SeqQueuePtr Q)
{if (NULL != Q){free(Q);Q = NULL;}printf("boom!!\n");return;
}

main.c

#include "dui_lie.h"
int main(int argc, char const *argv[])
{SeqQueuePtr Q = queue_create();if (NULL == Q){return -1;}queue_push(Q,90);queue_push(Q,80);queue_push(Q,100);queue_push(Q,20);queue_show(Q);queue_pop(Q);queue_pop(Q);queue_show(Q);printf("数组实际大小为%d:\n",queue_size(Q));queue_destroy(Q);return 0;
}

链式队列

链式存储的队列称为链式队列

实现原理:
        单向链表头插尾删实现:链表的头部就是队尾,链表的尾部就是队头                                

        单向链表头删尾插实现:链表的头部就是队头,链表的尾部就是队尾

        但是,上述操作中,都要用到链表尾部节点,都需要遍历整个链表完成,于是专门使用一个指针指向队尾,称为尾指针

00.h

#ifndef DAY17_1
#define DAY17_1#include <myhead.h>//类型重定义
typedef int datatype;//节点结构体
typedef struct Node
{union {datatype data;int len;};struct Node *next;}Node, *NodePtr;//头节点结构体
typedef struct Queue
{NodePtr head;NodePtr tail;}Queue, *QueuePtr;//队列创建
QueuePtr queue_create();//判空
int queue_empty(QueuePtr Q);//头插
int queue_push(QueuePtr Q,datatype);//遍历
int queue_show(QueuePtr Q);//出队
int queue_pop(QueuePtr Q);//输出实际大小
int queue_size(QueuePtr Q);//销毁
void queue_destroy(QueuePtr Q);#endif // DAY17_1

00.c

#include "00.h"//先创建队列 然后创建链表,将队列的两个指针指向链表
QueuePtr queue_create()
{//申请队列的空间QueuePtr Q = (QueuePtr)malloc(sizeof(Queue));if (NULL == Q){printf("创建失败\n");return NULL;}//创建链表Q->head = (NodePtr)malloc(sizeof(Node));if (Q->head == NULL){printf("创建失败\n");free(Q);return NULL;}Q->head->len = 0;Q->head->next = NULL;Q->tail = Q->head;return Q;
}int queue_empty(QueuePtr Q)
{return Q->head->len == 0;
}int queue_push(QueuePtr Q,datatype e)
{if (NULL == Q){return -1;}NodePtr p = (NodePtr)malloc(sizeof(Node));if (NULL == p){return -1;}p->data = e;p->next = NULL;Q->tail->next = p;Q->tail = p;Q->head->len++;}int queue_show(QueuePtr Q)
{if (NULL == Q || queue_empty(Q)){return -1;}NodePtr q = Q->head->next;while (q){printf("%d\t",q->data);q = q->next;}putchar(10);
}int queue_pop(QueuePtr Q)
{if (NULL == Q){return -1;}NodePtr p = Q->head->next;Q->head->next = p->next;printf("%d 出队\n",p->data);free(p);p = NULL;//如果所有节点都出列成功,将尾节点重新指向头节点if (Q->tail == NULL)//Q->head->next == NULL{Q->tail = Q->head;}Q->head->len--;
}int queue_size(QueuePtr Q)
{if (NULL == Q){return -1;}return Q->head->len;
}void queue_destroy(QueuePtr Q)
{if (NULL == Q){return;}//释放所有节点while (!queue_empty(Q)){queue_pop(Q);}//释放头结点free(Q->head);Q->head = Q->tail = NULL;//释放队列空间free(Q);Q = NULL;
}

main.c

#include "00.h"int main(int argc, char const *argv[])
{QueuePtr Q = queue_create();if (NULL == Q){return -1;}queue_push(Q,233);queue_push(Q,1314);queue_push(Q,520);queue_show(Q);queue_pop(Q);queue_pop(Q);queue_pop(Q);queue_destroy(Q);return 0;
}

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

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

相关文章

Spring Boot+WebSocket向前端推送消息

​ 博客主页: 南来_北往 &#x1f525;系列专栏&#xff1a;Spring Boot实战 什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;允许服务器主动向客户端推送信息&#xff0c;同时也能从客户端接收信息。 WebSocket协议诞生于2008年&#…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

springboot旅游规划系统-计算机毕业设计源码60967

摘 要 微信小程序的旅游规划系统设计旨在为用户提供个性化的旅游规划服务&#xff0c;结合Spring Boot框架实现系统的高效开发与部署。该系统利用微信小程序平台&#xff0c;包括用户信息管理、目的地选择、行程规划、路线推荐等功能模块&#xff0c;为用户提供便捷、智能的旅…

英迈中国与 Splashtop 正式达成战略合作协议

2024年7月23日&#xff0c;英迈中国与 Splashtop 正式达成战略合作协议&#xff0c;英迈中国正式成为其在中国区的战略合作伙伴。此次合作将结合 Splashtop 先进的远程桌面控制技术和英迈在技术服务与供应链管理领域的专业优势&#xff0c;为中国地区的用户带来更加安全的远程访…

Python:对常见报错导致的崩溃的处理

Python的注释&#xff1a; mac用cmd/即可 # 注释内容 代码正常运行会报以0退出&#xff0c;如果是1&#xff0c;则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字&#xff0c;程序会崩溃&#xff0c;也就是破坏了程序&#xff0c;终止运行 解决方案&#xf…

Java开发之Redis

1、非关系型数据库、快、高并发、功能强大 2、为什么快&#xff1f;内存单线程 非阻塞的IO多路复用有效的数据类型/结构 3、应用&#xff1a;支持缓存、支持事务、持久化、发布订阅模型、Lua脚本 4、数据类型&#xff1a; 5 种基础数据类型&#xff1a;String&#xff08;字…

html 解决tooltip宽度显示和文本任意位置换行文本显示问题

.el-tooltip__popper {max-width: 480px;white-space: break-spaces; /* 尝试不同的white-space属性值 */word-break:break-all; }

前端文件下载word乱码问题

记录一次word下载乱码问题&#xff1a; 用的请求是axios库&#xff0c;然后用Blob去接收二进制文件 思路&#xff1a;现在的解决办法有以下几种&#xff0c;看看是对应哪种&#xff0c;可以尝试解决 1.将响应类型设为blob&#xff0c;这也是最重要的&#xff0c;如果没有解决…

C#开源、简单易用的Dapper扩展类库 - Dommel

项目特性 Dommel 使用 IDbConnection 接口上的扩展方法为 CRUD 操作提供了便捷的 API。 Dommel 能够根据你的 POCO 实体自动生成相应的 SQL 查询语句。这大大减少了手动编写 SQL 代码的工作量&#xff0c;并提高了代码的可读性和可维护性。 Dommel 支持 LINQ 表达式&#xff…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说&#xff0c;创建一个文件&a…

【Linux】:自定义shell(简易版)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来一期自定义shell&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏…

虚拟现实和增强现实技术系列—Expressive Talking Avatars

文章目录 1. 概述2. 背景介绍3. 数据集3.1 设计标准3.2 数据采集 4. 方法4.1 概述4.2 架构4.3 目标函数 5. 实验评测5.1 用户研究5.2 我们方法的结果5.3 比较与消融研究 1. 概述 支持远程协作者之间的交互和沟通。然而&#xff0c;明确的表达是出了名的难以创建&#xff0c;主…

SSRF中伪协议学习

SSRF常用的伪协议 file:// 从文件系统中获取文件内容,如file:///etc/passwd dict:// 字典服务协议,访问字典资源,如 dict:///ip:6739/info: ftp:// 可用于网络端口扫描 sftp:// SSH文件传输协议或安全文件传输协议 ldap://轻量级目录访问协议 tftp:// 简单文件传输协议 gopher…

媒体邀约专访与群访的区别?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约中的专访与群访在多个方面存在显著差异&#xff0c;以下是对这两种采访方式的详细比较&#xff1a; 一、定义与形式 专访&#xff1a; 定义&#xff1a;专访是指由媒体记者对单…

iOS 开发包管理之CocoaPods

CocoaPods&#xff08;Objective-C 时期&#xff0c;支持Objective-C和swift&#xff09;&#xff0c;CocoaPods下载第三方库源代码后会将其编译成静态库.a 文件 或动态库框架.framework 文件 的形式&#xff0c;并将它们添加到项目中&#xff0c;建立依赖关系&#xff0c;这种…

CPU与IO设备交互

距离cpu比较近的总线速度快&#xff0c;价格昂贵一些&#xff0c;根据重要程度选择总线&#xff0c;cpu不是通过总线直接和io设备相连接的&#xff0c;而是通过设备控制器进行连接的&#xff0c;暂时只需要关注cpu和设备控制器的直接进行的操作。 通过判断状态寄存器是否usy或者…

数据融合工具(15)线层、面层打折自动检测修复

一、内容导读 一个工具解决包括极小角在内的线层、面层要素的打折数据质量问题…… 小编提供了很多功能强大&#xff0c;应用场景广发的数据融合辅助工具集&#xff0c;能高效解决数据融合需要…… 数据融合工具&#xff08;1&#xff09;指定路径下同名图层合并 数据融合工具…

Linux云计算 |【第一阶段】SERVICES-DAY6

主要内容&#xff1a; Linux容器基础、Linux容器管理、podman命令行、管理容器进阶 实操前骤&#xff1a;安装 RHEL8.2 虚拟机 1.选择软件包&#xff1a;rhel-8.2-x86-dvd.iso&#xff1b; 2.内存2048M&#xff1b; 3.时区选择亚洲-上海&#xff0c;带GUI的服务器&#xff1b…

后端接口返回图片,前端的处理方法

接口返回如下图所示&#xff1a; 打印结果如下图所示&#xff1a; 出现问题的原因的axios默认返回的是json文本形式&#xff0c;二进制图片数据被强制转换成了 json 文本形式 处理方法&#xff1a; 首先&#xff0c;在axios中&#xff0c;将responseType默认返回数据类型json…

Python轻量级邮件发送库库之salmon使用详解

概要 电子邮件是现代通信的基础,在许多应用程序中,自动发送电子邮件是一个常见需求。salmon-mail 是一个基于 Python 的轻量级邮件发送库,它提供了简洁且强大的 API,用于处理电子邮件的发送和管理。本文将详细介绍 salmon-mail 库,包括其安装方法、主要特性、基本和高级功…