数据结构----队列

news2024/9/23 17:24:02

一、队列

1)队列定义

        队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 允许插入的端是队尾,允许删除的端是队头。队列是一个先进先出(FIFO)的线性表,相应 的也有顺序存储和链式存储两种方式。

2)循环队列

        顺序存储就是用数组实现,比如有一个n个元素的队列,数组下标0的一端是队 头,入队操作就是通过数组下标一个个顺序追加,不需要移动元素,但是如果删除 队头元素,后面的元素就要往前移动,对应的时间复杂度就是O(n),性能自然不 高。

        为了提高出队的性能,就有了循环队列,需要有两个指针,front指向队头,rear指 向对尾元素的下一个位置,元素出队时front往后移动,如果到了对尾则转到头部, 同理入队时rear后移,如果到了对尾则转到头部,这样通过下标front出队时,就不 需要移动元素了。

         同时规定,当队列为空时,front和rear相等,那么队列什么时候判断为满呢?按照 循环操作rear依次后移,然后再从头开始,也是出现rear和front相等时,队列满。

        这样跟队列空的情况就相同了,为了区分这种情况,规定数组还有一个空闲单元 时,就表示队列已满, (也就是队头指针在队尾指针的下一位置时,队满。) 因为rear 可能在front后面,也可能循环到front前面,所以队列满的条件就变成了 (rear+1)%maxsize == front 。 对于队列的元素个数计算为:(rear -front+maxsize)%maxsize。

3)用数组实现的顺序存储循环队列

4)   链式队列

        循环队列要事先申请好空间,整个过程都不能释放,而且要有固定的长度,如果长度事先无法估计,这种方式显然不够灵活;所以就引入了链式存储队列,其实就是 线性表的单链表,只是它只能对尾进,队头出。并且规定队头指针指向链队列的头结点,对尾指针指向终端节点,当队列为空时,front和rear都指向头结点。(尾插头删)

        入队操作,就是在链表尾部插入结点;出队操作就是头结点的后继结点出队,然后将头结点的后继后移。如果最后除了头结点外,只剩一个元素了,就把rear也指向头结点。

二、队列的操作步骤

1.构建静态数组队列结构

1)建立结构体

2)初始化队列

3)入队

4)出队

5)遍历

#include<stdio.h>
#include <stdlib.h>
#include  <string.h>
#include<stdbool.h>
#include<assert.h>

//静态数组构建队列结构
#define SIZE  5
typedef  int ele_type;

typedef struct queue
{
	ele_type arr[SIZE];
	int front;
	int real;
}  Queue;

//初始化队列
void init(Queue* que)
{
	assert(que);
	memset(que->arr, 0, sizeof(ele_type) * SIZE);
	que->front = 0;
	que->real = 0;
}

//插入元素--入队
bool  push_queue(Queue* que, ele_type val)
{
	assert(que);
	if ((que->real + 1) % SIZE == que->front)
		return false;

	que->arr[que->real] = val;
	que->real++;
	que->real = que->real % SIZE;
	return true;

}

//删除元素--出队
bool  pop_queue(Queue* que, ele_type* rtval)
{
	assert(que);
	if (que->front == que->real)
		return false;

	*rtval = que->arr[que->front++];

	que->front = que->front % SIZE;
	return true;

}

//遍历队列
void print_queue(Queue* que)
{
	if (que->front == que->real)
		return;

	if (que->front < que->real)
	{
		for (int i = que->front; i < que->real; i++)
		{
			printf("%d\n", que->arr[i]);

		}

	}
	else
	{
		for (int i = que->front; i < SIZE; i++)
		{
			printf("%d\n", que->arr[i]);
		}
		for (int i = 0; i < que->real; i++)
		{
			printf("%d\n", que->arr[i]);
		}

	}



}

//获取数组长度
int get_queue_size(Queue* que)
{

	return ((que->real - que->front + SIZE) % SIZE);

}

//清空数组
void Clear_queue(Queue* que)
{

	que->front = que->real = 0;

}


int main()
{
	Queue q;
	init(&q);
	push_queue(&q, 11);
	push_queue(&q, 12);
	push_queue(&q, 13);
	push_queue(&q, 14);


	ele_type temp;
	pop_queue(&q, &temp);
	printf("temp=%d\n", temp);
	pop_queue(&q, &temp);
	printf("temp=%d\n", temp);
	pop_queue(&q, &temp);
	printf("temp=%d\n", temp);
	push_queue(&q, 15);
	push_queue(&q, 16);
	printf("===================\n");
	print_queue(&q);
	printf("ele num=%d\n", get_queue_size(&q));

	return 0;
}

运行结果:


2.构建链表队列结构

1)建立结构体

2)初始化队列

3)入队

4)出队

5)遍历

#include<stdio.h>
#include <stdlib.h>
#include  <string.h>
#include<stdbool.h>
#include<assert.h>

//静态数组构建队列结构
#define SIZE  5
typedef  int ele_type;

typedef struct queue
{
	ele_type arr[SIZE];
	int front;
	int real;
}  Queue;

//初始化队列
void init(Queue* que)
{
	assert(que);
	memset(que->arr, 0, sizeof(ele_type) * SIZE);
	que->front = 0;
	que->real = 0;
}

//插入元素--入队
bool  push_queue(Queue* que, ele_type val)
{
	assert(que);
	if ((que->real + 1) % SIZE == que->front)
		return false;

	que->arr[que->real] = val;
	que->real++;
	que->real = que->real % SIZE;
	return true;

}

//删除元素--出队
bool  pop_queue(Queue* que, ele_type* rtval)
{
	assert(que);
	if (que->front == que->real)
		return false;

	*rtval = que->arr[que->front++];

	que->front = que->front % SIZE;
	return true;

}

//遍历队列
void print_queue(Queue* que)
{
	if (que->front == que->real)
		return;

	if (que->front < que->real)
	{
		for (int i = que->front; i < que->real; i++)
		{
			printf("%d\n", que->arr[i]);

		}

	}
	else
	{
		for (int i = que->front; i < SIZE; i++)
		{
			printf("%d\n", que->arr[i]);
		}
		for (int i = 0; i < que->real; i++)
		{
			printf("%d\n", que->arr[i]);
		}

	}



}

//获取数组长度
int get_queue_size(Queue* que)
{

	return ((que->real - que->front + SIZE) % SIZE);

}

//清空数组
void Clear_queue(Queue* que)
{

	que->front = que->real = 0;

}


int main()
{
	Queue q;
	init(&q);
	push_queue(&q, 11);
	push_queue(&q, 12);
	push_queue(&q, 13);
	push_queue(&q, 14);


	ele_type temp;
	pop_queue(&q, &temp);
	printf("temp=%d\n", temp);
	pop_queue(&q, &temp);
	printf("temp=%d\n", temp);
	pop_queue(&q, &temp);
	printf("temp=%d\n", temp);
	push_queue(&q, 15);
	push_queue(&q, 16);
	printf("===================\n");
	print_queue(&q);
	printf("ele num=%d\n", get_queue_size(&q));

	return 0;
}

运行结果:

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

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

相关文章

macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载

macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载 2024 年 8 月 8 日凌晨&#xff0c;macOS Sonoma 14.6.1 发布&#xff0c;本更新包含了重要的错误修复&#xff0c;并解决了导致高级数据保护无法启用或停用的问题。同时带来了 macOS Ventura 13.6.9 安全更新。 本…

ant-design源码解析——Upload上传组件

前言 文件上传是我们开发中不可或缺的一部分&#xff0c;我们将在本文深入解析Ant Design Upload组件的实现。 相信看完以后对于React以及Ant Design的工作原理理解能更上一层楼。 Upload.tsx 入口函数upload.tsx直接引用了AjaxUpload组件&#xff0c;引用了一些能力&#…

UVa1660/LA3031 Cable TV Network

UVa1660/LA3031 Cable TV Network 题目链接题意分析AC 代码 题目链接 本题是2004年icpc欧洲区域赛东南欧赛区的题目 题意 给定一个n&#xff08;n≤50&#xff09;个点的无向图&#xff0c;求它的点连通度&#xff0c;即最少删除多少个点&#xff0c;使得图不连通。如下图所示…

Java日志体系框架总结:JUL、JCL、SLF4J、Log4j、Logback、Log4j2

概述 日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志&#xff0c;可以在程序出现问题时帮助开发人员迅速地定位错误的根源。日志所能提供的功能是多种多样的&#xff0c;包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。 …

Day 22~28 MySQL

MySQL 1、数据库 JavaEE&#xff1a;企业级开发 Web 前端 &#xff08;页面&#xff1a;展示&#xff0c;数据&#xff09; 后台&#xff08;连接点&#xff1a;连接数据库JDBC&#xff0c;连接前端&#xff08;控制&#xff0c;控制视图跳转&#xff0c;给前端传递数据&…

dedecms织梦 验证码不显示问题

dedecms验证码不显示呢?近期小编仔细研究了一下并根据网上的各个版本总结下面几种解决方法&#xff1a; 问题一&#xff1a;首先先确定php配置环境没问题&#xff0c;如果一个服务器有的网站显示验证码有的不显示&#xff0c;可以排除运行环境的问题;出现这种情况有可能是&…

学习日志8.14--ALC(Access Control List)访问控制列表

ACL访问控制列表是一条或者多条流量规则的集合&#xff0c;作用主要用于流量的匹配&#xff0c;还可以匹配路由。通过ACL对流量加以控制&#xff0c;通过配合使用过滤工具&#xff0c;对流量进行拦截。需要注意的是ACL只是一个个匹配工具&#xff0c;负责匹配源IP地址、目的IP地…

nestjs 全栈进阶--typeorm 一对一

1. 介绍 在 TypeORM 中&#xff0c;一对一&#xff08;One-to-One&#xff09;关系是一种数据库关系&#xff0c;其中一个表中的每一行只与另一个表中的一行相关联。比如用户和身份证 2. 准备 我们还是将就上节课的项目&#xff0c;不过我们需要把数据库删除了 右键&#x…

[CSS3]2D与3D变换技术详解

文章目录 2D变换&#xff08;2D Transform&#xff09;3D变换&#xff08;3D Transform&#xff09;结语 CSS3中的2D变换与3D变换是指通过transform属性对HTML元素进行几何操作&#xff0c;使其在二维或三维空间中进行移动、旋转、缩放和倾斜等变换。这些变换为前端开发者提供了…

秒通多语种!2024年超实用的4款翻译在线工具,真心好用

互联网时代让沟通变得没有界限。不论是和邻居闲聊家常&#xff0c;还是与远在海外的朋友畅谈&#xff0c;现在都非常容易。特别是对于正在学习外语的人来说&#xff0c;在线翻译工具就像是超级英雄的披风一样重要。我研究了很多资料&#xff0c;找到了几款性价比非常高的翻译在…

Java虚拟机:类的加载机制

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 034 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【BUU】[Dest0g3 520迎新赛]Really Easy SQL

2024/8/14 [Dest0g3 520迎新赛]Really Easy SQL 题目标题说明是SQL注入 题目首页 页面title显示是钓鱼站点。 钓鱼站点主要为将我们的输入信息保存在数据库。后台应该是插入语句。 这里无论输入什么都显示密码错误, 只能尝试盲注&#xff0c;基于时间的盲注, 这里经过测试p…

OPC DAY-上海场提前预告:Softing带您探索“智能工厂中的OPC应用”

&#xff08;图片来源于&#xff1a;OPC基金会官网&#xff09; 时间&#xff1a;2024年9月25日 14:00-14:30 | OPC DAY-上海站 地点&#xff1a;上海国家会展中心-5.1H M5-03会议室 2024年9月24-28日&#xff0c;第二十四届中国国际工业博览会将于国家会展中心&#xff08;上…

Linux 中的同步机制

代码基于&#xff1a;Kernel 6.6 临界资源&#xff1a;指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是&#xff0c;如果有线程正在使用&#xff0c;其他进程必须等待直到该线程释放资源。 临界区&#xff1a;指在每个线程中访问临界资源的那段代码。…

vue3结合海康WEB开发包,开发web在线预览视频

我们这里选择V3.3版本 文档地址&#xff1a;https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type20&id4c945d18fa5f49638ce517ec32e24e24 解压过后&#xff0c;会有三个文件夹 在docs中&#xff0c;点开Demo使用说明&#xff0c;按照流程先测试下&…

赋能基层,融合创新:EasyCVR视频汇聚平台构建平安城市视频共享系统

一、雪亮工程建设的意义 雪亮工程的核心在于通过高清视频监控、环境监测和智能预警等先进技术手段&#xff0c;构建一个高效、智能、安全、便捷的社会安全防控体系。这一工程的建设不仅代表了现代化科技手段在城市治安管理中的应用&#xff0c;更是提升社会安全保障能力、推动…

树形结构查找(B树、B+树)

平衡树结构的树高为 O(logn) &#xff0c;平衡树结构包括两种平衡二叉树结构&#xff08;分别为 AVL 树和 RBT&#xff09;以及一种树结构&#xff08;B-Tree&#xff0c;又称 B 树&#xff0c;它的度大于 2 &#xff09;。AVL 树和 RBT 适合内部存储的应用&#xff0c;而 B 树…

CompreFace Study

系列文章目录 第一章 CompreFace Installation 第二章 Face verification POC 文章目录 系列文章目录前言一、What is the ComreFace&#xff1f;二、How to install the CompreFace? 1.On Linux for CompreFace 1.2.02.Troubleshooting总结 前言 此文旨在记录学习CompreF…

萤石取流播放失败自助排障及常见错误码解决方案

一、在使用播放地址播放时遇到播放失败的情况&#xff0c;可使用排障工具排查具体原因&#xff0c;以下具体介绍排障工具的使用方法 1、在浏览器里打开排障工具&#xff0c;地址&#xff1a;萤石开放平台-提供持续稳定的以音视频为主的全场景、多功能综合性服务 2、在第一行输入…

安全无忧!Windows7全补丁旗舰版:集成所有补丁!

今日&#xff0c;系统之家小编给大家分享集成所有补丁的Windows7旗舰版系统&#xff0c;集成至2023.12所有官方补丁&#xff0c;修复了系统高危漏洞&#xff0c;让大家时刻都能舒心地展开操作。系统基于微软 Windows 7 2009 SP1 旗舰版进行离线制作&#xff0c;全新升级的优化方…