队列顺序存储(详解)

news2025/1/21 12:45:48

队列是一种常见的数据结构,它是一种先进先出(First-In-First-Out, FIFO)的线性表。在队列中,数据元素按照插入的顺序排列,最先插入的元素在队列的前面,最后插入的元素在队列的后面。类比生活中排队购物的情景,先到先得的原则就是队列的特点。

队列具有以下基本概念和特点:

  1. 入队(enqueue):向队列的末尾插入(或加入)一个新元素。
  2. 出队(dequeue):从队列的头部移除(或取出)一个元素。
  3. 队头(front):队列的头部,即队列中的第一个元素。
  4. 队尾(rear):队列的尾部,即队列中的最后一个元素。
  5. 空队列(empty queue):队列中不包含任何元素。
  6. 满队列(full queue):队列已满,无法再插入新元素。
  7. 队列的大小(queue size):队列中包含的元素个数。

队列常用于模拟各种实际场景,例如计算机系统中的任务调度、打印队列、操作系统中的进程调度等。在算法和数据结构中,队列也是一种重要的基础数据结构,常用于解决各种问题,如广度优先搜索、树和图的遍历等。
在这里插入图片描述
队列的项目结构目录

在这里插入图片描述
头文件QueueStorage.h
在这里插入图片描述头文件QueueStorage.h代码

#ifndef SEQQUEUE_H
#define SEQQUEUE_H
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1024

// 顺序存储类似于数组定义一个结构体即可
typedef struct SEQQUEUE {
	// 无类型指针,可以接收如何数据类型的数据
	void* data[MAX_SIZE];
	// 数组的大小
	int size;

}SeqQueue;
// 初始化结构体
SeqQueue* Init_SeqQueue();
// 入队列
void Push_SeqQueue(SeqQueue* queue, void* data);
// 返回对头元素
void* Front_SeqQueue(SeqQueue* queue);
// 出队列
void* Pop_SeqQueue(SeqQueue* queue);
// 返回队尾的元素
void* Back_SeqQueue(SeqQueue* queue);
// 返回大小
int Size_SeqQueue(SeqQueue* queue);
//清空队列
void* Clear_SeqQueue(SeqQueue* queue);
// 销毁队列
void* FreeSpace_SeqQueue(SeqQueue* queue);


#endif

cpp文件截图

在这里插入图片描述cpp文件代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "QueueStorage.h"
// 初始化结构体
SeqQueue* Init_SeqQueue() {
	SeqQueue* queue = (SeqQueue*)malloc(sizeof(SeqQueue));
	// 使用for循环对队列进行初始化
	for (int i = 0; i < MAX_SIZE; i++) {
		// 将队列初始化为NULL
		queue->data[i] = NULL;
	}
	queue->size = 0;
	return queue;
};
// 入队列
void Push_SeqQueue(SeqQueue* queue, void* data) {
	// 确定数组的哪一个方向是对头:将数组的左边作为对头
	if (queue == NULL) {
		return;
	}
	if (data == NULL) {
		return;
	}
	// 将元素插入数组中,元素的移动
	if (queue->size == MAX_SIZE) {
		return;
	}
	queue->data[queue->size] = data;
	queue->size++;
};
// 返回对头元素
void* Front_SeqQueue(SeqQueue* queue) {
	if (queue == NULL) {
		return NULL;
	}
	if (queue->size == 0) {
		return NULL;
	}
	return queue->data[0];
};
// 出队列
void* Pop_SeqQueue(SeqQueue* queue) {
	// 移动元素
	if (queue == NULL) {
		return NULL;
	}
	if (queue->size == 0) {
		return NULL;
	}
	for (int i = 0; i < queue->size - 1; i++) {
		queue->data[i] = queue->data[i + 1];
	}
	queue->size--;
};
// 返回队尾的元素
void* Back_SeqQueue(SeqQueue* queue) {
	if (queue == NULL) {
		return NULL;
	}
	if (queue->size == 0) {
		return NULL;
	}

	return queue->data[queue->size-1];
};
// 返回大小
int Size_SeqQueue(SeqQueue* queue) {
	if (queue == NULL) {
		return -1 ;
	}
	return queue->size;
};
//清空队列
void* Clear_SeqQueue(SeqQueue* queue) {
	if (queue == NULL) {
		return NULL;
	}
	queue->size = 0;
};
// 销毁队列
void* FreeSpace_SeqQueue(SeqQueue* queue) {
	if (queue == NULL) {
		return NULL;
	}
	free(queue);
};

主文件截图main.cpp
在这里插入图片描述主文件代码mian.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "QueueStorage.h"

typedef struct PERSON {
	char name[64];
	int age;

}Person;

int main()
{
	SeqQueue* queue = Init_SeqQueue();
	// 创建数据
	Person p1 = { "aaa",10 };
	Person p2 = { "bbb",20 };
	Person p3 = { "ccc",30 };
	Person p4 = { "ddd",40 };
	Person p5 = { "eee",50 };
	



	//数据入队列调用push函数
	Push_SeqQueue(queue, &p1);
	Push_SeqQueue(queue, &p2);
	Push_SeqQueue(queue, &p3);
	Push_SeqQueue(queue, &p4);
	Push_SeqQueue(queue, &p5);

	// 输出队尾元素
	Person* backPerson = (Person*)Back_SeqQueue(queue);
	printf("name:%s age:%d", backPerson->name, backPerson->age);
	
	//输出
	while (Size_SeqQueue(queue) > 0) {
	    // 取出对头元素
		Person* p = (Person*)Front_SeqQueue(queue);
		// 输出
		printf("name = %s age = %d \n",p->name,p->age);
		// 从对头弹出元素
		Pop_SeqQueue(queue);

	}

	// 销毁队列
	FreeSpace_SeqQueue(queue);
	system("pause");
	return 0;
}

项目运行结果展示
在这里插入图片描述

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

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

相关文章

登录界面(flex布局练习)

练习&#xff1a;登录界面在我们网页制作的过程中经常遇见&#xff0c;所以请你编写一个界面联系一下&#xff0c;这个可以增加一些动画或者是其他的效果&#xff0c;当然越帅越好。请使用flex或者其他布局练习 例如&#xff1a; 代码 <!DOCTYPE html> <html lang…

如何做好小红书?9条小红书运营起号心得(必读)

关于小红书运营细节和方法&#xff0c;总结了以下9条起号心得&#xff0c;希望给近期新手们一些经验借鉴。 一、出现一条爆文后的策略当账号新发的一篇笔记流量起飞了&#xff0c;不要急于发布新内容。先让爆文的流量消耗殆尽&#xff0c;等流量开始减少时再发布新笔记。同时&…

2022CVPR(PoseC3D):Revisiting Skeleton-based Action Recognition

Revisiting Skeleton-based Action Recognition 摘要1、引言2、相关工作3、框架3.1. 姿势提取的良好实践3.2.从2D姿势到3D热图体积3.3.基于骨架的动作识别的3D-CNN 4、实验4.2.姿势提取4.3. 3D热图体积的预处理4.4.与GCN的比较4.5. RGBPose-SlowFast4.6.与最先进的比较 5、结论…

C语言-联合和枚举

------------------------------------ --------------- ------ 最慢的步伐不是跬步&#xff0c;而是徘徊&#xff1b; 最快的脚步不是冲刺&#xff0c;而是坚持。 今天来到我们的联合和枚举类型的讲解&#xff1a; 目录 联合体类型 联合体类型的声明 联合体类型的特点 …

Effective Java解读

Effective Java 第一章 引言第二章 创建和销毁对象第1条&#xff1a;用静态工厂方法代替构造器第2条&#xff1a;遇到多个构造器参数时要考虑使用构建器第3条&#xff1a;用私有构造器或者枚举类型强化Singletion属性第4条&#xff1a;通过私有构造器强化不可实例化的能力第5条…

计算机网络的分类

目录 一、按照传输介质进行分类 1、有线网络 2、无线网络 二、按照使用者进行分类 1、公用网 (public network) 2、专用网(private network) 三、按照网络规模和作用范围进行分类 1、PAN 个人局域网 2、LAN 局域网 3、MAN 城域网 4、 WAN 广域网 5、Internet 因特…

canvas基础:fillStyle 和strokeStyle示例

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 上色…

工具类整理

常用工具类 在java的庞大体系中&#xff0c;其实有很多不错的小工具&#xff0c;也就是我们平常说的&#xff1a;轮子。 CollectionUtils 目前比较主流的是spring的org.springframework.util包下的CollectionUtils工具类。和apache的org.apache.commons.collections包下的Co…

SmartSoftHelp8,应用程序优化,稳定性优化,性能优化,并发承载优化工具

winform 应用全局捕获异常 WPF 应用全局捕获异常 asp.net web 应用全局捕获异常 MVC web 应用全局捕获异常 netcore 应用全局捕获异常 一级缓存&#xff1a;html、cs&#xff0c;js 网页前端缓存设置 二级缓存&#xff1a;asp.net 客户端缓存设置 二级缓存&#xff…

测试Centos上用Gunicorn启动的Django-Web服务在Django源文件有改变的情况下能否自动重载最新源码下的web服务

01-先上传最新的源码文件 参考博文 https://blog.csdn.net/wenhao_ir/article/details/134762966 进行 02-先在Django直接开web服务下修改源码测试 这是没有问题的&#xff0c;会自己重置。 03-开启gunicorn服务 cd /djangoproject/mmdj01/ gunicorn -c /djangoproject/mm…

【Android】MMKV实现本地持久化

引入 (测试操作机器是华为Mate 20 Pro 128G&#xff0c;Android 10&#xff0c;每组重复1k次&#xff0c;时间单位是ms) 可以看出MMKV的耗时比其他耗时少的离谱。再看多进程下的性能&#xff1a; 不必多说。再看和DataStore的对比&#xff1a; 简介 根据MMKV官方文档所言 MM…

【数电笔记】20-有约束的逻辑函数化简

目录 说明&#xff1a; 约束项和约束条件 1. 引例 1.1 引例中的约束项 1.2 引例中的约束条件 利用约束项 / 约束条件化简逻辑函数 1. 例1 2. 例2 3. 例3 4. 例4 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并未记录所有章节&#xff0…

宝塔+docker+jenkins部署vue项目----笔记版

宝塔dockerjenkins部署vue项目&#xff08;保姆级教程&#xff09;https://blog.csdn.net/weixin_47284756/article/details/129339940 基于上述教程&#xff0c;不同的地方。 1.我使用的是gitee&#xff0c;所以需要在jenkins中安装gitee插件 配置gitee&#xff0c;其他默认配…

基于51单片机的十字路口交通灯_5s黄灯倒计时闪烁

基于51单片机十字路口交通灯_5s黄灯闪烁 &#xff08;程序仿真仿真视频&#xff09; 仿真&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;J006 功能要求 交通灯运行状态&#xff1a; &#xff08;1&…

Shell循环:whileuntil

一、特点&#xff1a;循环次数[一定]是固定的 二、while语句结构 while 条件测试 do 循环体 done 当条件测试成立&#xff08;条件测试为真&#xff09;&#xff0c;执行循环体 演示&#xff1a; 需求&#xff1a;每秒显示一个数字&#xff0c;一…

webpack如何处理浏览器的样式兼容问题postcss

一、准备工作 css/index.css添加样式 .word {color: red;user-select: none; } 为了兼容不同的浏览器我们需要添加前缀比如&#xff1a; -webkit-user-select: none; 这个工作可以通过postcss的插件postcss-preset-env处理 二、安装依赖 pnpm i -D postcss postcss-loader…

淘宝店铺所有商品数据接口(淘宝 API 接口)

要获取淘宝店铺所有商品数据&#xff0c;您可以使用淘宝开放平台提供的 API 接口。具体步骤如下&#xff1a; 在淘宝开放平台注册并登录&#xff0c;创建一个应用&#xff0c;获取到所需的 App Key 和 App Secret 等信息。 使用获取到的 App Key 和 App Secret 进行签名和认证…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建OA系统

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

Python Rich:让终端显示更具视觉效果

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python开发中&#xff0c;命令行界面&#xff08;CLI&#xff09;经常被用于交互和数据展示。虽然命令行界面通常被视为简单、枯燥的文本显示区域&#xff0c;但通过Python的Rich库&#xff0c;我们可以为命令…

Java 使用itextpdf创建Pdf文件

DOM文件添加Maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.0</version><type>pom</type></dependency> 主要代码&#xff1a; PdfFont font PdfFo…