【C语言】实现队列

news2024/11/24 3:53:15


目录

(一)队列

 (二)头文件

(三) 功能实现

(1)初始化

(2) 销毁队列

(3) 入队

(4)出队 

(5)得到队头的数据 

(6)得到队尾的数据

(7)判断队列是否为空

(8)得到队列内数据个数 


正文开始:

(一)队列

        队列是一种数据结构,其中元素按照先进先出(FIFO)的顺序进行操作。在队列中,新元素被插入到队列的尾部,而删除元素发生在队列的头部。

        队列可以用于处理任务或事件的顺序,例如处理请求、消息传递等。可以将任务或事件放入队列的尾部,并按照它们被放入队列的顺序进行处理。

        队列的常见操作包括入队(向队列尾部添加元素)、出队(从队列头部删除元素)、获取队列头部的元素(但不删除)、判断队列是否为空等。

        队列可以用数组或链表实现。使用数组实现的队列称为顺序队列,使用链表实现的队列称为链式队列。顺序队列的插入和删除操作会涉及元素的移动,而链式队列不需要移动元素,因此插入和删除操作的时间复杂度都是O(1)。

 (二)头文件

         队列可以使用链表实现,也可以使用顺序表实现,但是队列需要频繁的头删,顺序表的头删效率低,由于队列规定了队头出,队尾进,所以顺序表的随机访问功能在队列中用不到;而链表的头删与尾插效率高,适合实现队列,因此本文用链表实现队列。


         什么是SLT?

SLT库 

        STL(Standard Template Library)是C++的标准库,提供了一组通用数据结构和算法的模板,可以方便地用于各种应用程序的开发。

        STL包含了多个模块,其中最重要的被称为容器(Containers)、算法(Algorithms)和迭代器(Iterators)。

        容器模块包括了多种数据结构,如向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。这些容器提供了不同的数据组织方式和操作,可以根据需要选择合适的容器进行数据存储和访问。

        算法模块包含了多种常用算法,如排序、查找、合并、遍历等。这些算法可以用于各种数据结构上,无需重复实现,只需直接调用相应的算法函数即可。

        迭代器模块提供了一种通用的访问容器元素的方式,通过迭代器可以遍历容器中的元素,并进行读取、修改等操作。迭代器相当于一个指针,可以指向容器中的某个位置,通过迭代器可以直接访问容器中的元素。

 

        本文根据Cpp的STL库来实现队列(Queue)的相关功能:包括队列初始化,销毁,向队列中插入数据(入队),删除数据(出队),得到队列的头数据(front),得到队列的尾数据(tail),判断队列是否为空,得到队列内数据个数等共八项功能接口。

这里不加解释的给出头文件,根据头文件来实现队列的具体功能:

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

/*		基于链表实现队列,入数据的为队尾,出数据的为队头
 *		顺序表实现队列头删效率低
 *		顺序表的随机访问队列中用不到
 *		所以选择用链表实现队列
*/
//队列存储数据类型
typedef int QueueDatatype;

//队列的一个节点
typedef struct QueueNode
{
	QueueDatatype data;
	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,QueueDatatype x);

//删除队列的数据
void Qpop(Queue* pq);

//得到front数据
QueueDatatype Qfront(Queue* pq);

//得到tail数据
QueueDatatype Qback(Queue* pq);

//判断队列是否为空
bool Qempty(Queue* pq);

//得到队列内数据个数
int Qsize(Queue* pq);

(三) 功能实现

(1)初始化

队列初始化

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        将队列的头尾指针都置空,表示此时队列内没有任何数据,数据个数(size)置0;


//初始化队列
void Qinit(Queue* pq)
{
	assert(pq);

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

(2) 销毁队列

销毁队列

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        创建pcur指针,遍历链表;

        创建next指针,保存下一个节点,防止释放此节点后,无法解引用找到下一个节点;

        最后,分别指向队头与队尾的phead与ptail指针要置空;


//销毁队列
void QDestroy(Queue* pq)
{
	assert(pq);

	QNode* pcur = pq->phead;
	while (pcur)
	{
		QNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	pq->ptail = pq->phead = NULL;
}

(3) 入队

入队

         首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        入队时,队列有两种状态:

        若队列为空(此时队头队尾都为空),让头指针和尾指针都指向新节点newnode;

        若队列不为空,执行尾插;

        不要忘记让队列的size++;


//向队列插入数据
void Qpush(Queue* pq, QueueDatatype x)
{
	assert(pq);

	//获取新节点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail!");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;

	//队列为空,此时队头队尾都为空
	if (pq->phead == NULL)
	{
		assert(pq->ptail == NULL);//防止一个为NULL一个不为NULL的情况

		pq->phead = pq->ptail = newnode;
	}
	else//队列不为空,尾插
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	//队列节点数加一
	pq->size++;
}

(4)出队 

出队

          首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        判断队列不为空,通过assert断言实现;

        执行头删,创建next指针保存phead的next节点,freephead后,通过next找到新的头节点;

        不要忘记队列的size--;


//删除队头的数据
void Qpop(Queue* pq)
{
	assert(pq);
	assert(!Qempty(pq));
	
	QNode* next = pq->phead->next;
	free(pq->phead);
	pq->phead = next;
	pq->size--;
}

        

(5)得到队头的数据 

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        直接返回即可;


//得到front数据
QueueDatatype Qfront(Queue* pq)
{
	assert(pq);

	return pq->phead->data;
}

 

(6)得到队尾的数据

 

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        直接返回即可;


//得到tail数据
QueueDatatype Qback(Queue* pq)
{
	assert(pq);

	return pq->ptail->data;
}

 

(7)判断队列是否为空

         返回判断表达式的结果;(若队列为空,返回真(1),否则返回假(0))

 

/判断队列是否为空
bool Qempty(Queue* pq)
{
	//队列为空,返回真;非空,返回假
	return pq->size == 0;
}

 

(8)得到队列内数据个数 

         直接返回队列的size即可;


//得到队列内数据个数
int Qsize(Queue* pq)
{
	return pq->size;
}


完 ~

未经作者同意禁止转载

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文精读】GPT1

摘要 如何从大量未标注文本中获取词级别的信息有两个主要挑战&#xff0c;使用何种优化目标能有效地学习文本表示&#xff0c;如何有效地将学习到的表示迁移到目标任务。针对这些问题&#xff0c;本文提出一种无监督预训练和有监督微调的组合的半监督方法&#xff0c;具体为&am…

Vue3+Ant-Design-Vue:报错Cannot read properties of null (reading ‘isCE‘)

问题描述 在使用Ant-Design-Vue内置的Table表格组件&#xff0c;实现expand展开行功能时&#xff0c;报错&#xff1a;Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘) 。 报错信息图示&#xff1a; 在GitHub上找到如下描述&#xff0c; 解决方案 网上…

【maya 入门笔记】基本视图和拓扑

1. 界面布局 先看基本窗口布局&#xff0c;基本窗口情况如下&#xff1a; 就基本窗口布局的情况来看&#xff0c;某种意义上跟blender更像一点&#xff08;与3ds max相比&#xff09;。 那么有朋友就说了&#xff0c;玛格基&#xff0c;那blender最下面的时间轴哪里去了&…

书生浦语大模型实战营-课程笔记(4)

微调分为两种&#xff0c;增量预训练和指令跟随。 指令跟随微调&#xff1a; 1.只对答案计算Loss 2.训练时数据为一问一答的形式&#xff08;input和output&#xff09; 增量预训练&#xff1a; 只需要output的数据进行训练 xtuner:微调框架 操作部分的笔记参考git上的文档…

杨中科 ASP.NET DI综合案例

综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务&#xff0c;然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置&#xff0c;可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…

python 基础知识点(蓝桥杯python科目个人复习计划43)

今日复习内容&#xff1a;做点真题和继续复习动态规划 例题1&#xff1a;三国游戏 &#xff08;用的知识点是贪心和排序&#xff09; 题目描述&#xff1a; 小蓝正在玩一款游戏&#xff0c;游戏中魏&#xff08;X&#xff09;&#xff0c;蜀&#xff08;Y&#xff09;&…

HAL/LL/STD STM32 U8g2库 +I2C SSD1306/sh1106 WouoUI磁贴案例

HAL/LL/STD STM32 U8g2库 I2C SSD1306/sh1106 WouoUI磁贴案例 &#x1f4cd;基于STM32F103C8T6 LL库驱动版本&#xff1a;https://gitee.com/chcsx/platform-test/tree/master/MDK-ARM&#x1f3ac;视频演示&#xff1a; WouoUI移植磁贴案例&#xff0c;新增确认弹窗 &#x1f…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_3

《剑指Offer》笔记&题解&思路&技巧&优化_Part_3 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 138. 有效数字——表示数值的字符串2. LCR 139. 训练计划…

【数据结构】17 二叉树的建立

二叉树的建立 由于树是非线性结构&#xff0c;创建一颗二叉树必须首先确定树中结点的输入顺序&#xff0c;常用方法是先序创建和层序创建。 层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各…

AI数据中心网络架构需求:400/800G光模块

随着AI技术和相关应用的不断发展&#xff0c;大模型、大数据和AI计算能力在AI发展中的重要性日益凸显。大模型和数据集构成AI研究的软件基础&#xff0c;而AI算力是关键的基础设施。在本文中&#xff0c;我们将探讨AI发展对数据中心网络架构的影响。 Fat-Tree数据中心网络架构…

《白话C++》第10章 STL和boost,Page67~70 std::auto_ptr

std::auto_ptr可以不经意间转移裸指针控制权 std::auto_ptr持有裸指针的控制权&#xff0c;却可以随随便便看似不经意地转移给另一个auto_ptr: #include <iostream> #include <memory>using namespace std;struct S {int a;void SetA(int a){this->a a;}~S()…

跟着pink老师前端入门教程(JavaScript)-day02

三、变量 &#xff08;一&#xff09;变量概述 1、什么是变量 白话&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器&#xff0c;通过变量名获取数据&#xff0c;甚至数据可以修改 2、变量在内存中的存储 本质&#xff1a;变量是程序在内存…

记录:零基础小白初学云计算 第一天

一、认识【rootlocalhost ~】# root:当前登录用户的用户名 localhost&#xff1a;主机名 ~&#xff1a;当前用户的家目录 #&#xff1a;超级用户的命令提示符 基础命令 ifup ens33&#xff1a;启动网卡 ip a&#xff1a;查看IP地址 远程连接端口默认 &#xff1a;22 二…

WordPress主题YIA移动端文章页的面包屑不显示怎么办?

平时我们一般都会在文章页导航菜单下方显示面包屑&#xff0c;类似于“当前位置&#xff1a;boke112百科 WordPress 正文”。平时用浏览器调试站点的时候&#xff0c;在Edge浏览器的“切换设备仿真”中&#xff0c;不管是选择什么设备都会显示面包屑。具体如下图所示&#xf…

C#,整数转为短字符串(Short string)的加解密算法与源代码

1 整数转为短字符串的应用 网站生成的动态 URL 往往以内容序列号id为标识与参数&#xff0c;比如&#xff1a; http://www.jerry.com/tom.aspx?id1 使用 Web Rewrite&#xff0c;可以实现网页静态化&#xff0c;称为&#xff1a; http://www.jerry.com/content/1.html 对…

论文阅读-PIM-tree:一种面向内存处理的抗偏移索引

论文名称&#xff1a;PIM-tree: A Skew-resistant Index for Processing-in-Memory 摘要 当今的内存索引性能受到内存延迟/带宽瓶颈的限制。Processing-in-memory (PIM) 是一种新兴的方法&#xff0c;可能通过实现低延迟内存访问&#xff0c;其聚合内存带宽随 PIM 节点数量扩…

【Linux系统化学习】文件重定向

目录 文件内核对象 文件描述符的分配规则 重定向 重定向的概念 dup2系统调用 输出重定向 追加重定向 输入重定向 stderr解析 重定向到同一个文件中 分离常规输出和错输出 文件内核对象 上篇文章中我们介绍到了操作系统中的文件&#xff0c;操作系统为了方…

react使用Map方法遍历列表不显示的问题

问题&#xff1a; 在最开始搭建选项卡的时候&#xff0c;我的js代码是这样的 import React, { Component } from react import ./css/02-maizuo.css export default class App extends Component {state {list: [{id: 1,text: 电影},{id: 2,text: 影院}, {id: 3,text: 我的}…

MySQL DQL 基本查询

一.概念 数据查询不应只是简单返回数据库中存储的数据&#xff0c;还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。 二.语法格式 select 列名 from 表 where 条件 1.查询所有的商品 select * from product; 2.查询商品名和商品价格 select pname,price from…

Quantitative Analysis: PIM Chip Demands for LLAMA-7B inference

1 Architecture 如果将LLAMA-7B模型参数量化为4bit&#xff0c;则存储模型参数需要3.3GB。那么&#xff0c;至少PIM chip 的存储至少要4GB。 AiM单个bank为32MB&#xff0c;单个die 512MB&#xff0c;至少需要8个die的芯片。8个die集成在一个芯片上。 提供816bank级别的访存带…