当前位置: 首页 > news >正文

队列顺序存储(详解)

队列是一种常见的数据结构,它是一种先进先出(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;
}

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

相关文章:

  • 外包搞了6年,技术退步明显......
  • 浅谈智能配电房电力运维平台的开发与应用
  • Centos7设置永久路由
  • QT中的 容器(container)-大全
  • 智加科技获全国首张重卡无人驾驶开放道路测试牌照
  • 【源码篇】基于SpringBoot+thymeleaf实现的大学生自习室座位预定系统
  • 【MySQL】-日志系统
  • python爬虫进阶篇(异步)
  • Kubernetes1.27容器化部署Prometheus
  • pyqt5使用pyqtgraph实现动态热力图
  • UI自动化测试工具有哪些优势?
  • 蓝桥杯第四场双周赛(1~6)
  • uniapp之Vue3配置跨域(代理)
  • 算法通关村第七关—理解递归(青铜)
  • 在Springboot中操作Redis——五大数据类型
  • SSR是什么?Vue中怎么实现?
  • 【交换排序 简单选择排序 堆排序 归并排序】
  • install pnpm : 无法加载文件的解决办法
  • 国内高速下载huggingface上的模型
  • 第二章[变量与数据类型]:2.7:布尔类型
  • 5吨煤炭“瞬间蒸发”?掺水炭致企业损失千万,腐败窝案曝光
  • 哲学新书联合书单|远离苏格拉底
  • 一手实测深夜发布的世界首个设计Agent - Lovart。
  • 吉林:消纳绿电,“氢”装上阵
  • 退休10年后,70岁成都高新区管委会原巡视员王晋成被查
  • 第1现场 | 印巴停火次日:当地民众逐渐恢复正常生活