队列的实现

简介: 队列的实现

1.队列的概念及结构

队列:只允许在一端进行插入数据操作在另一端进行删除数据操作特殊线性表,队列具有先进先出 FIFO(First In First Out)

  • 入队列:进行插入操作的一端称为队尾
  • 出队列:进行删除操作的一端称为队头

2.队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。

我们可以用单链表来实现:

2.1创建一个队列

先创建一个结构体封装数据之间的关系

再创建一个结构体封装队列的头和尾

2.2初始化

2.3销毁

2.4入队列

2.5出队列

2.6取队列头数据

2.7取队列尾数据

2.8判空

2.9返回队列有效元素个数

2.10访问

当队列不为空的时候,访问队头数据,访问一个pop一个

3.总代码

Queue.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
//创建
typedef int QDataType;
typedef struct QueueNode
{
  QDataType val;
  struct QueueNode* next;
}QNode;
typedef struct Queue
{
  QNode* phead;
  QNode* ptail;
  int size;
}Queue;
//把队列的头尾封装在一个结构体中
//初始化
void QInit(Queue* pq);
//销毁
void QDestroy(Queue* pq);
//入队列
void QPush(Queue* pq, QDataType x);
//出队列
void QPop(Queue* pq);
//取队头数据
QDataType QFront(Queue* pq);
//取队尾数据
QDataType QBack(Queue* pq);
//判空
bool QEmpty(Queue* pq);
//返回队列有效元素个数
int QSize(Queue* pq);

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
//初始化
void QInit(Queue* pq)
{
  assert(pq);
  pq->phead = pq->ptail = NULL;
  pq->size = 0;
}
//销毁
void QDestroy(Queue* pq)
{
  assert(pq);
  QNode* cur = pq->phead;
  while (cur)
  {
    QNode* next = cur->next;
    free(cur);
    cur = next;
  }
  pq->phead = pq->ptail = NULL;
  pq->size = 0;
}
//入队列
void QPush(Queue* pq, QDataType x)
{
  assert(pq);
  //创建newnode
  QNode* newnode = (QNode*)malloc(sizeof(QNode));
  if (newnode == NULL)
  {
    perror("malloc fail");
    return;
  }
  newnode->val = x;
  newnode->next = NULL;
  if (pq->ptail == NULL)
  {
    pq->phead = pq->ptail = newnode;
  }
  else
  {
    pq->ptail->next = newnode;
    pq->ptail = newnode;
  }
  pq->size++;
}
//出队列
void QPop(Queue* pq)
{
  assert(pq);
  assert(pq->phead);
  QNode* del = pq->phead;
  pq->phead = pq->phead->next;
  free(del);
  del = NULL;
  if (pq->phead == NULL)
  {
    pq->ptail = NULL;
    //防止ptail成为野指针
  }
  pq->size--;
}
//取队头数据
QDataType QFront(Queue* pq)
{
  assert(pq);
  assert(pq->phead);
  return pq->phead->val;
}
//取队尾数据
QDataType QBack(Queue* pq)
{
  assert(pq);
  assert(pq->ptail);
  return pq->ptail->val;
}
//判空
bool QEmpty(Queue* pq)
{
  assert(pq);
  return pq->phead == NULL;
}
//返回队列有效元素个数
int QSize(Queue* pq)
{
  assert(pq);
  return pq->size;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
int main()
{
  Queue Q;
  QInit(&Q);
  QPush(&Q, 1);
  QPush(&Q, 2);
  QPush(&Q, 3);
  QPush(&Q, 4);
  QPush(&Q, 5);
  int size = QSize(&Q);
  printf("%d\n", size);
  while (!QEmpty(&Q))
  {
    printf("%d ", QFront(&Q));
    QPop(&Q);
  }
  QDestroy(&Q);
  return 0;
}


相关文章
|
网络协议 安全
libev与多线程
libev与多线程
libev与多线程
|
JavaScript
JS自动生成速记符、拼音简写/拼音的声母(例如:“你挚爱的强哥”转换为“NZADQG”)。提取首字母,返回大写形式;提取拼音, 返回首字母大写形式(全拼)。
JS自动生成速记符、拼音简写/拼音的声母(例如:“你挚爱的强哥”转换为“NZADQG”)。提取首字母,返回大写形式;提取拼音, 返回首字母大写形式(全拼)。
14958 0
|
XML JSON API
淘宝天猫API接入说明(淘宝天猫商品详情+关键词搜索商品列表)商品详情数据,商品sku数据,商品优惠券数据
业务场景:作为全球最大的 B2C 电子商务平台之一,淘宝天猫平台提供了丰富的商品资源,吸引了大量的全球买家和卖家。为了方便开发者接入淘宝天猫平台,淘宝天猫平台提供了丰富的 API 接口,其中历史价格接口是非常重要的一部分。大家有探讨稳定采集淘宝(天猫)京东阿里拼多多等平台整站实时商品详情历史价格数据接口,通过该接口开发者可以更好地了解商品的情况,商品详情数据详细信息查询,数据参数包括:商品链接,商品列表主图、价格、标题,sku,库存,销量,店铺昵称,店铺等级,商品详情SKU属性,商品视频,商品优惠券,促销信息,详情属性描述,宝贝ID,区域ID,发货地,发货至,快递费用,物流费用等页面上有的数据
|
机器学习/深度学习 Python
概率论常见面试问题总结,含答案
概率论常见面试问题总结,含答案
|
关系型数据库 Serverless 分布式数据库
ICDE’24 | 中国企业首获最佳论文,详解PolarDB Serverless如何在0.5秒内实现跨机迁移
数据库领域顶会 ICDE 2024于5月13-17日在荷兰乌特勒支(Utrecht, Netherlands)举办。ICDE (The International Conference on Data Engineering) 与VLDB、SIGMOD被公认为是国际数据管理领域三大顶级学术会议,此次在荷兰召开的ICDE 2024大会,共吸引北京大学、清华大学、浙江大学、MIT、斯坦福等机构,以及谷歌、微软、阿里云、华为、字节等公司的近1000名人员参会,共同探讨AI、数据库、数据处理领域的前沿技术问题。
|
8月前
|
弹性计算 运维 监控
云资源运维与管理体验分享
作为一名开发工程师,我分享了在云资源运维与管理中的体验。健康状态功能实时监控ECS实例的关键指标,如CPU负载、内存使用率等,及时预警并解决问题,确保业务连续性。诊断功能通过日志分析和性能剖析快速定位复杂问题,提升故障处理效率。建议优化包括自定义告警阈值、多维度数据展示、自动化修复、集成更多日志源及建立用户反馈机制。这些功能显著提升了系统的稳定性和运维效率。
132 4
|
存储 监控 算法
Zookeeper安装部署
原因分析: 也即是下载的是未编译的 tar 包。 注:zookeeper 从 3.5 版本以后,命名就发生了改变,如果是apache-zookeeper-3.6.2.tar.gz这般命名的,都是未编译的,而 apache-zookeeper-3.6.2-bin.tar.gz 这般命名的,才是已编译的包。 解决方案: 重新下载 apache-zookeeper-3.6.2-bin.tar.gz包,然后解压使用。 问题二描述: 在下载了已编译的 apache-zookeeper-3.6.2-bin.tar.gz 包并解压,且在conf文件夹下拷贝并重命名了一份 zoo.cfg文件后,在启动 bin
141 1
|
11月前
|
网络协议 JavaScript 数据安全/隐私保护
深入浅出:使用WebSocket打造实时Web应用
【10月更文挑战第2天】本文介绍了WebSocket的基本概念、工作原理以及如何在项目中实现WebSocket通信。希望通过本文,读者能够掌握WebSocket,并考虑在自己的项目中实现实时功能。
|
存储 分布式计算 大数据
大数据技术概述
大数据技术概述
2051 3
|
应用服务中间件 Linux nginx
【项目部署系列教程】3. 安装宝塔 vs nginx
【项目部署系列教程】3. 安装宝塔 vs nginx
244 0