主页 > 互联网  > 

队列顺序存储(详解)

队列顺序存储(详解)

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

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

入队(enqueue):向队列的末尾插入(或加入)一个新元素。出队(dequeue):从队列的头部移除(或取出)一个元素。队头(front):队列的头部,即队列中的第一个元素。队尾(rear):队列的尾部,即队列中的最后一个元素。空队列(empty queue):队列中不包含任何元素。满队列(full queue):队列已满,无法再插入新元素。队列的大小(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; }

项目运行结果展示

标签:

队列顺序存储(详解)由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“队列顺序存储(详解)