数据结构之队列,实现队列的增删改查

news/2024/11/1 18:25:25/

目录

一、队列的定义

二、队列的实现

1.使用链表来实现队列

2.实现队列的接口

初始化队列 void QueueInit(Queue *pq)

队尾入队列 void QueuePush(Queue *pq,QDataType data)

队头出队列 void QueuePop(Queue *pq)

获取队列头部元素 QDataType QueueFront(Queue *pq)

获取队列尾部元素 QDataType QueueBack(Queue *pq)

获取队列中的有效元素个数 int QueueSize(Queue *pq)

检测队列是否为空,bool QueueEmpty(Queue *q)

销毁队列 void QueueDestroy(Queue *q)

总结



 


提示:以下是本篇文章正文内容,下面案例可供参考

一、队列的定义

队列:只允许在一端进行插入,另外一端进行删除数据的特殊线性表,队列具有先进先出

入队列:在进行插入操作的一端称为队尾

出队列:在进行删除操作的一端称为队头

二、队列的实现

队列可以使用数组和链表实现,使用数组的结构时,出队列在数据头上出数据,效率低

1.使用链表来实现队列

typedef int QDataType;
//链式结构,表示队列
typedef struct QueueNode
{struct QueueNode * next;QDataType data;
}QNode;//队列的结构
typedef struct Queue
{QNode * head;QNode * tail;int size;
}Queue;

2.实现队列的接口

初始化队列 void QueueInit(Queue *pq)

void QueueInit(Queue *pq)
{assert(pq);pq->head=NULL;pq->tail=NULL;pq->size = 0;
}

队尾入队列 void QueuePush(Queue *pq,QDataType data)

void QueuePush(Queue *pq,QDataType x)
{assert(pq);//插入节点,自己构造一个新节点QNode * newnode =(QNode *)malloc(sizeof(QNode));if(newnode ==NULL){perror("error");exit(-1);}newnode->data = x;newnode->next = NULL;//要考虑是否为空队列if(pq->tail ==NULL){pq->head = pq->tail = newnode;}else{//尾插pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}

队头出队列 void QueuePop(Queue *pq)

void QueuePop(Queue *pq)
{assert(pq);assert(!QueueEmpty(pq));//特殊情况,要考虑只有一个节点,释放之后,head指向空,tail为野指针if(pq->head->next ==NULL){free(pq->head);pq->head = pq->tail = NULL;}//保存当前节点,head指向下一个,释放当前节点else{   QNode * del = pq->head;pq->head = pq->head->next;free(del);}pq->size--;
}

获取队列头部元素 QDataType QueueFront(Queue *pq)

QDataType QueueFront(Queue *pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}

获取队列尾部元素 QDataType QueueBack(Queue *pq)

QDataType QueueBack(Queue *pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

获取队列中的有效元素个数 int QueueSize(Queue *pq)

如果使用遍历,size++的方式,时间复杂度为O(n);如果使用全局变量size来计算个数,会在有多个队列的时候容易混乱。所以在定义队列的时候,增加一个size变量,插入的时候size++,删除的时候size--,计算个数的时候可以直接返回size的大小,此时时间复杂度为O(1)

int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

检测队列是否为空,bool QueueEmpty(Queue *q)

如果为空返回非0结果,如果不为空返回0 

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL && pq->tail == NULL;
}

销毁队列 void QueueDestroy(Queue *q)

 void QueueDestroy(Queue *q)
{QNode * cur = pq->head;while(cur !=NULL){QNode * cur = pq->head;while(cur!=NULL){QNode * del = cur;cur = cur->next;free(del);}//删除完了之后,head和tail为野指针,所以需要置空pq->head = pq->tail = NULL;
}

总结

本文主要记录了用链表实现队列,以及对队列的增删改查,技术有限,如有错误请指正。


http://www.ppmy.cn/news/60518.html

相关文章

java学习之异常二

目录 一、异常处理机制 一、try-catch-finally 二、throws 二、try-catch 异常处理使用细节 三、try-catch-finally练习 第一题 第二题 第三题 第四题 一、异常处理机制 共有两种异常处理机制 一、try-catch-finally 处理机制图示 二、throws 关于第二点,如E…

Android性能监控:主循环性能统计LooperStatsService详解

作者:飞起来_飞过来 简介 在Android性能监控和优化领域,一个会影响App性能表现的因素与Handler Message Looper机制有关。当Looper里面的Message处理不及时、或数量太多占用过多处理时间时,可能会出现卡顿感,并且不容易定位到卡顿…

苦学58天,最后就这结果......

背景 非计科大专一枚,当初学的机械自动化专业。大学完全可以说是玩过来的,临近毕业开始慌了,毕业后一直没能找到工作,在高中同学(211 计科)的引领下,入坑程序员,学的软件测试。 从…

Unity如何上传一个文件到服务器

在游戏开发过程中,有时候需要上传一些文件到远程服务器上,比如游戏资源文件、玩家数据等等。在Unity中,我们可以使用UnityWebRequest类来实现文件上传功能。本文将详细介绍Unity如何上传一个文件到服务器,并给出Unity与服务器的核…

Java RSA密钥转换,从RSAPrivateKey得到RSAPublicKey

概述: 在Java编程中,我们经常用到如下一段代码来生成RSA公私钥,分别拿到公私钥然后加解密计算: KeyPairGenerator keyPairGen; keyPairGen KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048, new S…

每日学术速递4.27

Subjects: cs.CV 1.End-to-End Spatio-Temporal Action Localisation with Video Transformers 标题:使用视频转换器进行端到端时空动作定位 作者:Alexey Gritsenko, Xuehan Xiong, Josip Djolonga, Mostafa Dehghani, Chen Sun, Mario Lučić, Corde…

ChatGPT带你领略自动驾驶技术

一、自动驾驶技术现概述 自动驾驶技术是指利用计算机、传感器和其他设备,使车辆能够在不需要人类干预的情况下自主行驶的技术。目前,自动驾驶技术已经在一些汽车厂商和科技公司中得到广泛应用,但仍然存在一些技术和法律上的挑战,需…

盖雅工场发布数字化转型人效实践案例集

近日,盖雅工场重磅发布《聚集人效,重塑组织:典范企业管理实践案例集》(以下简称案例集)。 过去一年,盖雅工场携旗下盖雅学苑访谈了来自制造业、服务业、连锁零售业、汽车产业的几十家企业后,并…