数据结构:队列

数据结构:队列

在这里插入图片描述

文章目录

  • 数据结构:队列
    • 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.队列典型应用

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

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

    在这里插入图片描述

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

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

相关文章

Visual studio+Qt开发环境搭建以及注意事项和打开qt的.pro项目

下载qt-然后安装5.14.2_msvc2017 不知道安装那个就全选5.14.2的父级按钮 https://download.qt.io/archive/qt/5.14/5.14.2/ 安装Visual studio,下载直接下一步就行 配置Visual studio的qt环境 在线安装-重启Visual studio会自动安装 离线安装-关闭Visual studio点击安装 关闭…

a16z:加密行业2024趋势“无缝用户体验”

近日&#xff0c;知名加密投资机构a16z发布了“Big ideas 2024”&#xff0c;列出了加密行业在 2024 年几个具备趋势的“大想法”&#xff0c;其中 Seamless UX&#xff08;无缝用户体验&#xff09;赫然在列。 从最为直观的理解上&#xff0c;Seamless UX 是在强调用户在使用产…

路由器原理

目录 一.路由器 1.路由器的转发原理 2.路由器的工作原理 二.路由表 1.路由表的形成 2.路由表表头含义 直连&#xff1a; 非直连&#xff1a; 静态 静态路由的配置 负载均衡&#xff08;浮动路由&#xff09; 默认路由 动态 三.交换与路由对比 一.路由器 1.路由器…

独立完成软件的功能的测试(4)

独立完成软件的功能的测试&#xff08;4&#xff09; &#xff08;12.14&#xff09;&#xff08;功能测试>头条项目实战&#xff09; 项目总体概述 项目背景和定位&#xff1a;一款汇聚科技咨询&#xff0c;技术文章和问答交流的用户移动终端产品&#xff0c;用户可以通过…

STM32在CTF中的应用和快速解题

题目给的是bin文件&#xff0c;基本上就是需要我们手动修复的固件逆向。 如果给的是hex文件&#xff0c;我们可能需要使用MKD进行动态调试 主要还是以做题为目的 详细的可以去看文档&#xff1a;https://pdf1.alldatasheet.com/datasheet-pdf/view/201596/STMICROELECTRONIC…

微服务学习:Gateway服务网关

一&#xff0c;Gateway服务网关的作用&#xff1a; 路由请求&#xff1a;Gateway服务网关可以根据请求的URL或其他标识符将请求路由到特定的微服务。 负载均衡&#xff1a;Gateway服务网关可以通过负载均衡算法分配请求到多个实例中&#xff0c;从而平衡各个微服务的负载压力。…

一入二出热电阻温度信号隔离变送器

一入二出热电阻温度信号隔离变送器 用于测量铂热电阻Pt10,Pt100,Pt1000,Cu50,Cu100的热电阻传感器的小型仪器设备。广泛应用于工业测量温度系统&#xff0c;是降低成本且有效的测量方式。 型号&#xff1a;JSD TARZ-1002系列 我们来看下有什么特点&#xff1a; ◆小体积&#x…

天猫数据分析平台-天猫销售数据查询软件-11月天猫平台冲锋衣市场销售运营数据分析

随着气温逐渐下降&#xff0c;保暖服饰迎来热销&#xff0c;冲锋衣的需求大增。如今冲锋衣已经不仅仅是户外运动的装备&#xff0c;还成为很多年轻人的日常穿搭和时尚的追求。 新的穿搭趋势也带来了巨大的市场机会。据公开数据显示&#xff0c;中国有冲锋衣生产及经营企业超过8…

竞赛保研 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

什么是纯净IP?如何判断IP地址的纯净度?有哪些干净IP推荐?

您是否想知道什么使代理“干净”或如何确保您的代理不会将您列入网站的黑名单&#xff1f;对于通过代理访问网络的人来说&#xff0c;干净的代理是无缝在线体验的重要组成部分。在这篇文章中&#xff0c;我们将深入研究干净代理的世界&#xff0c;并探讨决定其质量的因素。 一、…

k8s常用命令及示例(三):apply 、edit、delete

k8s常用命令及示例(三)&#xff1a;apply 、edit、delete 1. kubectl apply -f 命令&#xff1a;从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下&#xff1a;kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…

加速数据采集:用OkHttp和Kotlin构建Amazon图片爬虫

引言 曾想过轻松获取亚马逊上的商品图片用于项目或研究吗&#xff1f;是否曾面对网络速度慢或被网站反爬虫机制拦截而无法完成数据采集任务&#xff1f;如果是&#xff0c;那么本文将为您介绍如何用OkHttp和Kotlin构建一个高效的Amazon图片爬虫解决方案。 背景介绍 亚马逊&a…

Spring Boot之自定义starter

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Boot的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. starter是什么 二.为什么要使…

万界星空科技AI低代码云MES系统

在企业生产管理过程中&#xff0c;从市场、生产现场到产品交付&#xff0c;生产制造行业都面临着诸多挑战&#xff0c;比如&#xff1a; 订单排产难度大&#xff1a;订单混乱&#xff0c;常漏排产、错排产&#xff1b;产能不明晰&#xff0c;无法承诺交期&#xff0c;常丢单&a…

智慧工地源码(微服务+Java+Springcloud+Vue+MySQL)

智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三…

python selenium chrome114版本之后环境配置和携带缓存打开chrome

尽力局 chrome驱动环境配置chrome打开带缓存设置待缓存打开自动关闭浏览器自动关闭浏览器弹窗 最终代码找资料难啊最终效果代码 依赖包和生成依赖包方法关闭谷歌升级 chrome驱动环境配置 网上找到的资料&#xff0c;我现在安装的是120版本的&#xff0c;这个资料是可行的。比较…

物流实时数仓:数仓搭建(DWD)一

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 物流实时数仓&#xff1a;数仓搭建&#xff08;DIM&#xff09; 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&#xff09;一 文章目录 系列文章目录前言一、文件编写1.目录创建2.b…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(一)

锁的获取 5.1 锁的强弱 当线程已经持有的锁比新申请的锁更强时&#xff0c;认为已经持有了锁&#xff0c;无需再对申请锁类型加锁。锁的强弱指持有的锁与其他锁的不兼容集合大小&#xff0c;集合相同锁相同&#xff0c;集合更大锁更强&#xff0c;否则无强弱关系。通过锁的兼…

Kafka-Kafka基本原理与集群快速搭建

一、Kafka介绍 ​ ChatGPT对于Apache Kafka的介绍&#xff1a; Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理…

JAVA:深入探讨Map的多种遍历方式

1、简述 在现代编程中&#xff0c;Map&#xff08;映射&#xff09;是一种常见的数据结构&#xff0c;用于存储键-值对。在许多编程语言中&#xff0c;Map提供了灵活的数据组织方式&#xff0c;但为了充分发挥其功能&#xff0c;我们需要了解多种遍历方式。本文将深入探讨Map的…