数据结构-队列 c语言使用链表和数组分别实现

news/2024/11/13 15:12:57/文章来源:https://www.cnblogs.com/wujingzhilv/p/18370041

队列

定义

队列(queue)是一种遵循先入后到规则的线性数据结构,将队列头部称为“队首”,尾部称为“队尾”,把元素加入队尾称为“入队”,删除队首元素称为“出队”。

队列实现

基于链表的实现

将链表的头节点和尾结点分别视为“队首”和“队尾”,规定队尾仅可添加节点,队首仅可删除节点。

/* 基于链表实现的队列 */
typedef struct
{ListNode *front, *rear;int queSize;
} LinkedListQueue;/* 构造函数 */
LinkedListQueue *newLinkedListQueue()
{LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));queue->front = NULL;queue->rear = NULL;queue->queSize = 0;return queue;
}/* 析构函数 */
void delLinkedListQueue(LinkedListQueue *queue)
{// 释放所有节点while (queue->front != NULL){ListNode *tmp = queue->front;queue->front = queue->front->next;free(tmp);}// 释放 queue 结构体free(queue);
}/* 获取队列的长度 */
int size(LinkedListQueue *queue)
{return queue->queSize;
}/* 判断队列是否为空 */
bool empty(LinkedListQueue *queue)
{return (size(queue) == 0);
}/* 入队 */
void push(LinkedListQueue *queue, int num)
{// 尾节点处添加 nodeListNode *node = newListNode(num);// 如果队列为空,则令头、尾节点都指向该节点if (queue->front == NULL){queue->front = node;queue->rear = node;}// 如果队列不为空,则将该节点添加到尾节点后else{queue->rear->next = node;queue->rear = node;}queue->queSize++;
}/* 访问队首元素 */
int peek(LinkedListQueue *queue)
{assert(size(queue) && queue->front); // 队列为空时,不能访问队首元素,assert是宏,用于断言,断言失败会终止程序return queue->front->val;
}/* 出队 */
int pop(LinkedListQueue *queue)
{int num = peek(queue);ListNode *tmp = queue->front;queue->front = queue->front->next;free(tmp);queue->queSize--;return num;
}/* 打印队列 */
void printLinkedListQueue(LinkedListQueue *queue)
{int *arr = malloc(sizeof(int) * queue->queSize);// 拷贝链表中的数据到数组int i;ListNode *node;for (i = 0, node = queue->front; i < queue->queSize; i++){arr[i] = node->val;node = node->next;}printArray(arr, queue->queSize);free(arr);
}

基于数组实现

在数组中删除首元素的时间复杂度为O(N),导致出队效率低,可以用一个巧妙方法避免这个问题。

使用一个变量front指向队首元素的索引,并维护一个变量size用于记录队列长度,则定义rear=front+size,计算出rear指向队尾元素的下个位置,则数组中包含元素的有效区间为[front,rear-1],这时,出入队操作只需进行一次操作,时间复杂度均为O(1).

有一个问题:在不断入队和出队的过程中,front和rear都在向右移动,当他们到达数组尾部就无法继续移动了,为了解决这个问题,可以将数组视为首尾相接的“环形数组”,

实现思路:我们需要将front或rear再越过数组尾部时,直接回到数组头部继续遍历,这种周期性规律可以通过“取余操作”来实现

/* 基于环形数组实现的队列 */
typedef struct
{int *nums;       // 用于存储队列元素的数组int front;       // 队首指针,指向队首元素int queSize;     // 队列长度,即队列中元素的个数int queCapacity; // 队列容量,即数组长度
} ArrayQueue;/* 构造函数 */
ArrayQueue *newArrayQueue(int capacity)
{ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));// 初始化数组queue->queCapacity = capacity;queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);queue->front = queue->queSize = 0;return queue;
}/* 析构函数 */
void delArrayQueue(ArrayQueue *queue)
{free(queue->nums);free(queue);
}/* 获取队列的容量 */
int capacity(ArrayQueue *queue)
{return queue->queCapacity;
}/* 获取队列的长度 */
int size(ArrayQueue *queue)
{return queue->queSize;
}/* 判断队列是否为空 */
bool empty(ArrayQueue *queue)
{return queue->queSize == 0;
}/* 访问队首元素 */
int peek(ArrayQueue *queue)
{assert(size(queue) != 0);return queue->nums[queue->front];
}/* 入队 */
void push(ArrayQueue *queue, int num)
{if (size(queue) == capacity(queue)){printf("队列已满\r\n");return;}// 计算队尾指针,指向队尾索引 + 1// 通过取余操作实现 rear 越过数组尾部后回到头部int rear = (queue->front + queue->queSize) % queue->queCapacity;// 将 num 添加至队尾queue->nums[rear] = num;queue->queSize++;
}/* 出队 */
int pop(ArrayQueue *queue)
{int num = peek(queue);// 队首指针向后移动一位,若越过尾部,则返回到数组头部queue->front = (queue->front + 1) % queue->queCapacity;queue->queSize--;return num;
}

典型应用

  • 淘宝订单
  • 代办事项:先来后到功能

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

liunx下安装Nginx

Linux下nginx的安装以及环境配置https://blog.csdn.net/qq_42815754/article/details/82980326第一步:下载nginx压缩包 在这里可以去nginx官网下载 https://nginx.org/en/download.html 也可以直接使用wget命令下载,指令如下所示(请根据自己的需求进行下载):建议选择官网发…

StringGrid单元格绑定ComboBox、DateTimePicker或窗口传值

一、初始化控件状态procedure TForm7.FormCreate(Sender: TObject); beginwith StringGrid1 dobeginColWidths[0] := 15;Cells[1, 0] := Combobox;ColWidths[1] := 100;Cells[2, 0] := DateTimePicker;ColWidths[2] := 100;Cells[3, 0] := Form;ColWidths[3] := 100;end;ComboB…

鸿蒙Next-支付宝SDK接入教程

App适配鸿蒙Next,开始做支付功能了,目前来说只有支付宝支持鸿蒙Next,微信还没上架,但是支付宝官方的文档跟Demo都很老,下载官方的Demo用最新版的DevEco-Studio导入都不成功。 后面在OpenHarmony三方库中心仓找到了最新的代码:https://ohpm.openharmony.cn/#/cn/detail/@c…

java 11

输出二维数组: public class erwei{ public static void main(String[] args){ int [][]arr={{0,0,0,0,0,0}, {,0,0,1,0,0,0}, {0,2,0,0,3,0}, {0,0,0,0,0,0}}; for(int i=0;i<arr.length;i++){ for (int j=0;j<arr[i].length ;j++ ) { System.out.print(arr[i][j]+&quo…

粒子群优化函数--particleswarm函数的用法与讨论

particleswarm函数是matlab自带的粒子群优化算法,其使用自适应的邻域模式搜索最优解,比我们之前自己写的代码要好得多,本章我们来讨论一下其思想与参数设置 目录一、自适应的邻域模式1.全局模式与邻域模式2.全局模式的优劣3.邻域模式的优劣4.何为“自适应”二、预设参数的选…

FLink1.17-Kafka实时同步到MySQL实践

1.组件版本组件版本Kafka3.7.0Flink1.17.0MySQL8.0.32 2.Kafka生产数据 ./kafka-console-producer.sh --broker-list hadoop01:9092,hadoop02:9092,hadoop03:9092 --topic kafka_test_table2 >{"id":123,"test_age":33} >{"id":125,&…

[Paper Reading] Reconstructing Hands in 3D with Transformers

名称 Reconstructing Hands in 3D with Transformers 时间:CVPR2024 机构:UC Berkeley, University of Michigan, New York University TL;DR 本文提出一种使用Transformer来做Hand Tracking的算法名为HaMeR(Hand Mesh Recorvery),优势是大数据规模(利用多数据集的2D/3D标签…

“就是打一打”清华程思元打出百度之星20年史上罕见两连冠

8月18日,被称为“技术界奥斯卡”的2024百度之星程序设计大赛(以下简称“百度之星” )落下帷幕。近千人同场敲代码、中学生几乎垄断奖项、背靠背冠军诞生……百度之星像中国编程次世代的技术嘉年华,越来越多人加入其中。近千学霸角逐“编程奥斯卡”,初小学生比例创新高 百度…

企业级Scrum敏捷赋能课程:为企业量身定制的敏捷开发培训,旨在提升团队协作与项目交付能力,实现敏捷管理的落地。

​ ​ 课程简介: Scrum 是一种广泛应用的敏捷开发方法,用于项目管理和产品研发。该课程为期两天,专为研发管理者、项目经理、产品经理和研发团队设计。通过案例讲解和沙盘演练,学员将深入理解Scrum的核心理念,如产品价值驱动、以用户为中心、快速迭代和增量交付,掌握自管…

使用对比!SLS 数据加工 SPL 与旧版 DSL 场景对照

这里我们继续讨论在不同的数据处理需求中,新版数据加工 SPL 与旧版数据加工 DSL 的使用对照。对于数据同步的场景,即不需要做任何数据处理,新版 SPL 与旧版 DSL 均传入空逻辑即可,以下不再赘述。作者:灵圣 概述 如前一篇《SLS 数据加工全面升级,集成 SPL 语法》所述,SLS…

Jenkins与gitlab持续集成配置webhook报500错误

Hook execution failed: Failed to open TCP connection to localhost:8585 (Connection refused - connect(2) for "localhost" port 8585) 在点击push events进行测试Jenkins时,出现上图,是因为gitlab没有打开一项权限,做如下设置即可

在孩子成长路上,爱与智慧的陪伴是送给孩子最好的礼物

如今智能设备的普及、社交媒体的兴起和娱乐方式的碎片化,使我们时刻被各种信息和刺激包围,这种环境对正处于成长期的儿童影响尤为显著,他们更容易被快节奏、高刺激的内容吸引,导致专注力下降,从而影响学习和认知能力的发展。针对这一现实挑战,数业智能心大陆推出了AI儿童…