数据结构:队列

数据结构:队列

在这里插入图片描述

文章目录

  • 数据结构:队列
    • 1.队列常用操作:
    • 2.队列的实现
    • 3.队列典型应用

***「队列 queue」是一种遵循先入先出规则的线性数据结构。***队列模拟了排队现象,即新来的人不断加入队列尾部,而位于队列头部的人逐个离开。只有当队头的的人逐个离开后,队尾的人才能到队头。

在这里插入图片描述

1.队列常用操作:

在这里插入图片描述

2.队列的实现

  • 实现队列可以基于链表实现,也可以基于数组实现

优势在于链表来实现队列更加方便,因为链表更容易进行头删操作,效率更高,进行头删时链表时间复杂度为O(1)数组时间复杂度为O(N)

下面我将用链表带头单向)实现队列:

Queue.h:

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//基于  带头单向链表  实现队列typedef int QueueDateType;typedef struct MyQueueNode
{QueueDateType val;struct MyQueueNode* next;}Queue;// 初始化队列 
Queue* Init();//打印队列
void Print(Queue* head);//创建节点
Queue* Createnewnode(QueueDateType data);// 队尾入队列 
void Push(Queue** head, QueueDateType data);// 队头出队列 
void Pop(Queue** head);// 获取队列头部元素 
QueueDateType Peek(Queue** head);// 获取队列队尾元素 
QueueDateType Back(Queue** head);// 获取队列中有效元素个数 
int Size(Queue* head);// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool Empty(Queue* head);// 销毁队列 
void Destroy(Queue** head);

Queue.c:

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"// 初始化队列
// 哨兵位初始化(创建链表的头结点)
Queue* Init()
{Queue* head = Createnewnode(-1);return head;
}//打印队列
void Print(Queue* head)
{assert(head);Queue* tail = head->next;if (tail == NULL){printf("链表为空");return;}while (tail){printf("%d ", tail->val);tail = tail->next;}}
//创建节点
Queue* Createnewnode(QueueDateType data)
{Queue* newnode = (Queue*)malloc(sizeof(Queue));if (newnode == NULL){perror("malloc");exit(-1);}newnode->next = NULL;newnode->val = data;return newnode;
}// 队尾入队列 (尾插)
void Push(Queue** head, QueueDateType data)
{assert(head);assert(*head);// 创造一个新节点Queue* newnode = Createnewnode(data);//如果链表最初就为空(除去哨兵位)if ((*head)->next == NULL){(*head)->next = newnode;}//找尾else{Queue* tail = (*head)->next;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}}// 队头出队列 (头删)
void Pop(Queue** head)
{assert(head);assert((*head)->next != NULL);Queue* first = (*head)->next;(*head)->next = first->next;free(first);first = NULL;
}// 获取队列头部元素 
QueueDateType Peek(Queue** head)
{assert(head);assert((*head)->next != NULL);return (*head)->next->val;
}// 获取队列队尾元素 
QueueDateType Back(Queue** head)
{assert(head);assert((*head)->next != NULL);Queue* tail = (*head)->next;while (tail->next != NULL){tail = tail->next;}return tail->val;}// 获取队列中有效元素个数 
int Size(Queue* head)
{assert(head);int sum = 0;while (head->next != NULL){sum++;head = head->next;}return sum;
}// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool Empty(Queue* head)
{if (Size(head) == 0){return true;}else{return false;}
}// 销毁队列 
void Destroy(Queue** head)
{assert(head);assert(*head);Queue* cur = (*head)->next;while (cur){Queue* next = cur->next;free(cur);cur = next;}free(*head);*head = NULL;
}

test.c:

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"//入队列测试
void test1()
{//初始化队列Queue* head = Init();Push(&head, 1);Push(&head, 2);Push(&head, 3);Push(&head, 4);Push(&head, 5);Print(head);Destroy(&head);}
//队头出队列测试
void test2()
{//初始化队列Queue* head = Init();Push(&head, 1);Push(&head, 2);Push(&head, 3);Push(&head, 4);Push(&head, 5);Pop(&head);Print(head);Destroy(&head);}
//获取头部元素测试
void test3()
{//初始化队列Queue* head = Init();Push(&head, 1);Push(&head, 2);Push(&head, 3);Push(&head, 4);Push(&head, 5);printf("%d\n", Peek(&head));Destroy(&head);}
// 获取队列队尾元素 
void test4()
{//初始化队列Queue* head = Init();Push(&head, 1);Push(&head, 2);Push(&head, 3);Push(&head, 4);Push(&head, 5);QueueDateType ret = Back(&head);printf("%d\n", ret);Destroy(&head);}
//获取元素个数测试
void test5()
{Queue* head = Init();Push(&head, 1);Push(&head, 2);Push(&head, 3);Push(&head, 4);Push(&head, 5);printf("%d\n", Size(head));Destroy(&head);}
//检测链表是否为空
void test6()
{Queue* head = Init();Push(&head, 1);Push(&head, 2);Push(&head, 3);Push(&head, 4);Push(&head, 5);if (Empty(head) == true){printf("链表为空\n");}else{printf("链表不为空\n");}Destroy(&head);}
int main()
{//入队列测试//test1();//队头出队列测试//test2();//获取头部元素测试//test3();// 获取队列队尾元素 //test4();//获取元素个数测试//test5();//检测链表是否为空test6();return 0;
}

3.队列典型应用

  • 淘宝订单。购物者下单后,订单将加入队列中,系统随后会根据顺序处理队列中的订单。在双十一期间,短时间内会产生海量订单,高并发成为工程师们需要重点攻克的问题。

  • 各类待办事项。任何需要实现“先来后到”功能的场景,例如打印机的任务队列、餐厅的出餐队列等,队列在这些场景中可以有效地维护处理顺序。

    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ceph的osd盘删除操作和iscsi扩展

ceph的osd盘删除操作 拓展:osd磁盘的删除(这里以删除node1上的osd.0磁盘为例) 1, 查看osd磁盘状态 [rootnode1 ceph]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.00298 root default -3 0.00099 host node10 hdd 0.00…

微服务实战系列之ZooKeeper(下)

前言 通过前序两篇关于ZooKeeper的介绍和总结&#xff0c;我们可以大致理解了它是什么&#xff0c;它有哪些重要组成部分。 今天&#xff0c;博主特别介绍一下ZooKeeper的一个核心应用场景&#xff1a;分布式锁。 应用ZooKeeper Q&#xff1a;什么是分布式锁 首先了解一下&…

云原生向量计算引擎 PieCloudVector:为大模型提供独特记忆

拓数派大模型数据计算系统&#xff08;PieDataComputingSystem&#xff0c;缩写&#xff1a;πDataCS&#xff09;在10月24日程序员节「大模型数据计算系统」2023拓数派年度技术论坛正式发布。πDataCS 以云原生技术重构数据存储和计算&#xff0c;「一份存储&#xff0c;多引擎…

C# 基本桌面编程(二)

一、前言 本章为C# 基本桌面编程技术的第二节也是最后一节。前一节在下面这个链接 C# 基本桌面编程&#xff08;一&#xff09;https://blog.csdn.net/qq_71897293/article/details/135024535?spm1001.2014.3001.5502 二、控件布局 1 叠放顺序 在WPF当中布局&#xff0c;通…

华为配置OSPF与BFD联动示例

组网需求 如图1所示&#xff0c;SwitchA、SwitchB和SwitchC之间运行OSPF&#xff0c;SwitchA和SwitchB之间的交换机仅作透传功能。现在需要SwitchA和SwitchB能快速感应它们之间的链路状态&#xff0c;当链路SwitchA-SwitchB发生故障时&#xff0c;业务能快速切换到备份链路Swi…

极狐GitLab DevSecOps 之容器镜像安全扫描

容器镜像安全 现状 最近某银行遭受供应链攻击的事件传的沸沸扬扬&#xff0c;安全又双叒叕进入了人们的视野。安全确实是一个非常重要&#xff0c;但是又最容易被忽略的话题。但是现在到了一个不得不人人重视安全&#xff0c;人人为安全负责的时代。尤其以现在非常火爆的云原…

java设计模式-工厂方法模式

1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口&#xff0c;将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 2.工厂方法模式的主要优缺点 优点&#xff1a; 用户只需要知道具体工厂的名称…

智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.乌燕鸥算法4.实验参数设定5.算法结果6.参考文…

低代码企业级PMO项目管理系统,360度全景透视企业管理视角

在一个崇高的目标支持下&#xff0c;不停地工作&#xff0c;即使慢&#xff0c;也一定会获得成功。 爱因斯坦 ★ 前情概要&#xff1a; 企业级PMO项目管理业务是行业里相对成熟和规范的业务&#xff0c;拥有众多商业套件和标准产品。 然而随着企业数字化建设进入深水区&#…

《Global illumination with radiance regression functions》

总结一下最近看的这篇结合神经网络的全局光照论文 这是一篇2013年TOG的论文。 介绍 论文的主要思想是利用了神经网络的非线性特性去拟合全局光照中的间接光照部分&#xff0c;采用了基础的2层MLP去训练&#xff0c;最终能实现一些点光源、glossy材质的光照渲染。为了更好的理…

解决App Store上架提示您必须上传 12.9 英寸 iPad Pro(第 2 代)显示屏的截屏

出错场景 在App Store Connect中&#xff0c;上架App时&#xff0c;出现以下错误提示. 要开始审核流程&#xff0c;必须提供以下项目&#xff1a;您必须上传 12.9 英寸 iPad Pro&#xff08;第 2 代&#xff09;显示屏的截屏。&#xff08;2048&#xff0c;2732&#xff09;您…

overleaf 加载pdf格式的矢量图时,visio 图片保存为pdf格式,如何确保pdf页面大小和图片一致

Overleaf支持多种矢量图形格式&#xff0c;其中一些常见的包括&#xff1a; PDF&#xff08;Portable Document Format&#xff09;&#xff1a; PDF是一种常见的矢量图形格式&#xff0c;Overleaf可以直接加载和显示PDF文件。许多绘图工具和LaTeX生成的图形都可以导出为PDF格式…

ShenYu网关Http服务探活解析

文章目录 网关端服务探活admin端服务探活 Shenyu HTTP服务探活是一种用于检测HTTP服务是否正常运行的机制。它通过建立Socket连接来判断服务是否可用。当服务不可用时&#xff0c;将服务从可用列表中移除。 网关端服务探活 以divide插件为例&#xff0c;看下divide插件是如何获…

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言&#xff1a; 本论文由同济大学、微软亚洲研究院、西安电子科技大学&#xff0c;于2023年12月11日中了AAAI2024 论文&#xff1a; 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址&#xff1a; [2312.06323]…

网络(十)ACL和NAT

前言 网络管理在生产环境和生活中&#xff0c;如何实现拒绝不希望的访问连接&#xff0c;同时又要允许正常的访问连接&#xff1f;当下公网地址消耗殆尽&#xff0c;且公网IP地址费用昂贵&#xff0c;企业访问Internet全部使用公网IP地址不够现实&#xff0c;如何让私网地址也…

机器翻译:跨越语言边界的智能大使

导言 机器翻译作为人工智能领域的瑰宝&#xff0c;正在以前所未有的速度和精度&#xff0c;为全球沟通拓展新的可能性。本文将深入研究机器翻译的技术原理、应用场景以及对语言交流未来的影响。 1. 简介 机器翻译是一项致力于通过计算机自动将一种语言的文本翻译成另一种语言的…

android studio 快捷输入模板提示

在Android开发中&#xff0c;我们经常会遇到一些重复性的代码&#xff0c;例如创建一个新的Activity、定义一个Getter方法等。为了提高开发效率&#xff0c;Android Studio提供了Live Templates功能&#xff0c;可以通过简化输入来快速生成这些重复性代码。 按下图提示设置&am…

【深度学习目标检测】八、基于yolov5的抽烟识别(python,深度学习)

YOLOv5是目标检测领域一种非常优秀的模型&#xff0c;其具有以下几个优势&#xff1a; 1. 高精度&#xff1a;YOLOv5相比于其前身YOLOv4&#xff0c;在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进&#xff0c;如更深的网络结构、更多的特征层和更高分辨率的输入图…

SI24R03国产自主可控RISC-V架构MCU低功耗2.4GHz收发芯片SoC

目录 RISC-V架构的优势SI24R03/04特性射频收发器模块特征MCU 模块特征 其他特征 RISC-V架构的优势 相对于目前主流的英特尔X86架构及ARM等架构来说&#xff0c;RISC-V架构具有指令精简、模块化、可扩展、开源、免费等优点。RISC-V的基础指令集只有40多条&#xff0c;加上其他基…

【问题记录】Qt IDE打开报错“由于找不到python27.dll,无法继续执行代码“

一&#xff0c;问题现象 新安装Qt打开时报错&#xff0c;如下所示&#xff0c;但是软件能正常打开。 二&#xff0c;问题原因 对应的dll库没有找到。 三&#xff0c;解决方法 找到对应的dll库复制到指定目录&#xff1b; 这里我本地搜索有这个库&#xff0c;就直接放到“…