队列的实现---超详细

队列的实现—超详细

在这里插入图片描述

文章目录

  • 队列的实现---超详细
    • 一、队列的模型
    • 二、代码实现以及测试用例
      • ①队列初始化
      • ②入队
      • ③出队
      • ④输出队头
      • ⑤输出队尾
      • ⑥判断队列是否为空
      • ⑦队列的长度
      • ⑧队列的销毁
      • ⑨测试用例

一、队列的模型

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
在这里插入图片描述
所以我们可以思考一下,这种结构如果用顺序表来实现一定是十分麻烦的,因为顺序表的头删的时间复杂度是O(N)。所以我们应该要采取链表来实现队列结构。
至于是单链表还是带头双向循环链表,其实都是无伤大雅的,在这里我们选择单链表。
结构:

typedef int SDataType;typedef struct Queue
{struct Queue* next;SDataType val;
}QU;

其实这样我们已经把单链表构建出来了,但是请大家思考两个问题:
如果是入队时,难道我每次入队都需要去找一次尾吗?
如果是计算队列长度时,这是一个不在连续空间存储的数据结构,我们如果简单的计算出长度呢?

所以我们可以再次引入一个结构体,将这个链表的头、尾和长度都计算出来。

typedef struct queue
{QU* phead;QU* tail;int size;
}q;

二、代码实现以及测试用例

①队列初始化

void QIni(q* p)
{assert(p);p->phead = p->tail = NULL;p->size = 0;
}

②入队

void QPush(q* p, QDataType x)
{assert(p);QU* newnode = (QU*)malloc(sizeof(QU));if (newnode == NULL){perror("malloc");exit(-1);}newnode->next = NULL;newnode->val = x;if (p->tail == NULL){p->phead = p->tail = newnode;}else{p->tail->next = newnode;p->tail = newnode;}p->size++;
}

③出队

void QPop(q* p)
{assert(p);assert(p->phead);QU* tmp = p->phead->next;free(p->phead);p->phead = tmp;if (p->phead == NULL){p->tail = NULL;//很关键}p->size--;
}

④输出队头

QDataType QFront(q* p)
{assert(p);assert(p->phead);return p->phead->val;
}

⑤输出队尾

QDataType QBack(q* p)
{assert(p);assert(p->tail);return p->tail->val;
}

⑥判断队列是否为空

bool QEmpty(q* p)
{assert(p);return p->phead == NULL;
}

⑦队列的长度

int QSize(q* p)
{assert(p);return p->size;
}

⑧队列的销毁

void QDestroy(q* p)
{assert(p);//assert(p->phead);QU* tmp = p->phead;while (tmp){QU* tmp2 = tmp->next;free(tmp);tmp = tmp2;}p->phead = p->tail = NULL;p->size = 0;
}

⑨测试用例

void test2()
{q p;QIni(&p);QPush(&p, 1);QPush(&p, 2);QPush(&p, 3);QPush(&p, 4);QPush(&p, 5);while (!QEmpty(&p)){printf("%d ", QFront(&p));QPop(&p);}printf("\n");QDestroy(&p);
}int main()
{test2();return 0;
}

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

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

相关文章

过滤器模式 rust和java的实现

文章目录 过滤器模式实现 过滤器模式实现javarustjavarust rust代码仓库 过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象&…

Unity中Shader矩阵的乘法

文章目录 前言一、矩阵乘以标量二、矩阵和矩阵相乘1、第一个矩阵的列数必须 与 第二个矩阵的行数相等,否则无法相乘!2、相乘的结果矩阵,行数由第一个矩阵的行数决定,列数由第二个矩阵的列数决定! 三、单位矩阵四、矩阵…

相对强弱指标 RSI

SMA(A,B,1)MA AA ,一天前的收盘价; BB,如果时涨的,把涨幅返回; CC,12天的涨幅占12天全部涨跌幅的多少; 画一条50 的线条。

窗口管理工具 Mosaic mac中文版功能特点

MosAIc mac是一种窗口管理工具,可帮助您在计算机屏幕上有效地组织和管理多个应用程序窗口。它提供了一种直观的方式来调整和排列窗口,以最大化工作效率。 MosAIc mac窗口管理软件功能和特点 窗口布局:MosAIc允许您选择不同的窗口布局&#x…

Games104现代游戏引擎笔记 面向数据编程与任务系统

Basics of Parallel Programming 并行编程的基础 核达到了上限,无法越做越快,只能通过更多的核来解决问题 Process 进程 有独立的存储单元,系统去管理,需要通过特殊机制去交换信息 Thread 线程 在进程之内,共享了内存…

从单测入手,完善Vue3源码中底层API effect功能

基于上一篇文章中实现的effect方法,根据 Vue3 源码中单测,完善该方法的三点功能,分别是: runner: effect可以返回自执行的入参runner函数scheduler: effect支持添加第二个参数选项中的scheduler功能stop: effect添加stop功能 ru…

LeetCode(17)罗马数字转整数【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 13. 罗马数字转整数 1.题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L …

修改 jar 包中的源码方式

在我们开发的过程中,我们有时候想要修改jar中的代码,方便我们调试或或者作为生产代码打包上线,但是在IDEA中,jar包中的文件都是read-only(只读模式)。那如何我们才能去修改jar包中的源码呢? 1.…

【中间件篇-Redis缓存数据库06】Redis主从复制/哨兵 高并发高可用

Redis高并发高可用 复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Re…

系列一、JVM的架构图

一、JVM的位置 JVM是运行在操作系统之上的,它与硬件没有直接的交互。 二、JVM的架构图

Python中的时间序列分析模型ARIMA

大家好,时间序列分析广泛用于预测和预报时间序列中的未来数据点。ARIMA模型被广泛用于时间序列预测,并被认为是最流行的方法之一。本文我们将学习如何在Python中搭建和评估用于时间序列预测的ARIMA模型。 ARIMA模型 ARIMA模型是一种用于分析和预测时间…

python科研绘图:绘制X-bar图

目录 1.X-bar 图的基本概念 2.X-bar 图的绘制过程 3.X-bar 图的优势 4.X-bar 图的绘制 1.X-bar 图的基本概念 X-bar控制图是一种统计工具,用于监控和控制生产过程中的质量变量。它是过程能力分析和统计过程控制(SPC,Statistical Process…