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

数据结构——队列

队列

概念与结构

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

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

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

类似一个饮水机:


 

队列底层结构选型

数组

链表

通过上图我们可以看出数组和链表的时间复杂度都差不多,队列可以由数组和链表实现,但是这里我们选择链表,因为如果我们使用数组的结构的话,出数列可以在数组头上出数据,效率会比较低。

队列的实现

我们使用链表,那是否能通过链表把时间复杂度降到O(1)呢?

答案是肯定的。只要我们能把ptail定出来,就可以实现尾插复杂度为O(1)。

队列结点结构

typedef int QDataType;
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QNode;

队列的结构

typedef struct Quene
{struct QueueNode* phead;struct QueueNode* ptail;
}Queue;

初始化队列

void QueueInit(Queue* pq)
{pq->phead = NULL;pq->ptail = NULL;
}

队尾入队列

QNode* BuyQueueNode(QDataType x)
{QNode* cur = (QNode*)malloc(sizeof(QNode));if (cur == NULL){perror("malloc failed!");exit(1);}else{cur->data = x;cur->next = NULL;return cur;}}
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* cur = BuyQueueNode(x);//如果队列为空if(pq->phead==NULL)pq->phead=pq->ptail = cur;else{pq->ptail->next = cur;pq->ptail = cur;}
}

队头出队列

void QueuePop(Queue* pq)
{assert(pq && pq->phead);if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}
}

 获取队列头部元素

QDataType QueueFront(Queue* pq)
{assert(pq && pq->phead);return pq->phead->data;
}

获取队列队尾元素 

QDataType QueueBack(Queue* pq)
{assert(pq && pq->phead);return pq->ptail->data;
}

获取队列中有效元素的个数 

int QueueSize(Queue* pq)
{assert(pq);QNode* pcur = pq->phead;int count = 1;while (pcur->next!=NULL){pcur = pcur->next;count++;}return count;
}

销毁队列 

void QueueDestroy(Queue* pq)
{if (pq->phead == NULL);else{while (pq->phead){QueuePop(pq);}}
}

 

 

 

 

 

 

http://www.xdnf.cn/news/1249.html

相关文章:

  • 华为交换机命令笔记
  • 【springsecurity oauth2授权中心】将硬编码的参数提出来放到 application.yml 里 P3
  • C++23 中 static_assert 和 if constexpr 的窄化布尔转换
  • Agent智能体ReAct机制深度解读:推理与行动的完美闭环
  • 实战华为1:1方式1 to 2 VLAN映射
  • hbuilderx云打包生成的ipa文件如何上架
  • 发送百度地图的定位
  • 7.6 GitHub Sentinel后端API实战:FastAPI高效集成与性能优化全解析
  • OpenCV中的透视变换方法详解
  • 【AI模型学习】Swin Transformer——优雅的模型
  • 【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现
  • 【微知】git reset --soft --hard以及不加的区别?
  • 入住刚装修好的新房,房间隔音太差应该怎么办?
  • Unity 带碰撞的粒子效果
  • OpenVINO教程(三):使用NNCF进行模型量化加速
  • MATLAB Coder 应用:转换 MATLAB 代码至 C/C++ | 实践步骤与问题解决
  • 【Pandas】pandas DataFrame truediv
  • 【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)
  • RESTful API 设计原则
  • 深度学习基石:神经网络核心知识全解析(一)
  • Curl用法解析
  • 前端频繁调用后端接口问题思考
  • 2025年4月22日(平滑)
  • 【Python笔记 03 】运算符
  • n8n更新1.87后界面报错Connection lost解决
  • 如何精准查询住宅IP?工具、方法与注意事项
  • HTML5+CSS3+JS小实例:CSS太阳动画特效
  • Java 静态内部类面试题与高质量答案合集
  • 源超长视频生成模型:FramePack
  • 丰富多样功能的小白工具,视频提取音频,在线使用,无需下载软件