首页 > 其他分享 >队列的实现

队列的实现

时间:2024-06-30 18:56:47浏览次数:18  
标签:assert QNode 队列 Queue 实现 front rear

队列

1.队列的概念及结构

队列:只允许在一端插入数据,另一端删除数据的特殊线性表。队列是先进先出。进行插入操作的一端是队尾,删除操作的一端是队头。
在这里插入图片描述

2.队列的实现

队列也可以由数组和链表实现,但是由链表实现更好。因为如果使用数组的结构,出队列在数组头上的数据,效率会比较低。
在这里插入图片描述

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>
// 链式结构:表示队列 
typedef int QDataType;
//单个节点的结构体
typedef struct QListNode
{
	struct QListNode* _next;
	QDataType _data;
}QNode;

// 队列的结构 
typedef struct Queue
{
	QNode* _front;
	QNode* _rear;
	int size;
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
 /*获取队列头部元素 */
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);

初始化一个队列

void QueueInit(Queue* q)
{
	assert(q);
	q->_front = q->_rear = NULL;
	q->size = 0;
}

下面这个是测试时要用到的打印代码

void print(Queue* q,int size)
{
	assert(q);
	QNode* str = q->_front;
	for (int i=0;i<size;i++)	
	{
		printf("%d ",str->_data);
		str = str->_next;
	}
}

获取队列中有效元素个数

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

队尾插入数据

void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->_data = data;
	newnode->_next = NULL;
	if (q->_front ==NULL)
	{
		q->_front = q->_rear=newnode;
	}
	else
	{
		q->_rear->_next = newnode;
		q->_rear = newnode;
		
	}
	q->size++;

}

代码的实现
在这里插入图片描述

队头释放节点

void QueuePop(Queue* q)
{
	assert(q);
	assert(q->_front);
	QNode* tem = q->_front;
	q->_front = q->_front->_next;
	free(tem);
	tem = NULL;
	if (q->_front == NULL)
	{
		q->_rear = NULL;
	}
	q->size--;
}

在这里插入图片描述

返回队头节点

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(q->_front);
	return q->_front->_data;
}

在这里插入图片描述

返回队尾节点

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(q->_rear);

	return q->_rear->_data;
}

在这里插入图片描述

检查队列是否为空

bool QueueEmpty(Queue* q)
{

	assert(q);
	return q->_front == NULL;
}

不为空
在这里插入图片描述
为空
在这里插入图片描述

销毁队列

void QueueDestroy(Queue* q)
{
	assert(q);
	QNode* cur = q->_front;
	while (cur)
	{
		QNode* next = cur->_next;
		free(cur);
		cur = next;

	}
	q->_front = q->_rear = NULL;
	q->size = 0;
}

先将每一个节点依次释放,然后再销毁队列

标签:assert,QNode,队列,Queue,实现,front,rear
From: https://blog.csdn.net/wujianghh/article/details/140080665

相关文章

  • 不能创建第三个变量,实现两个数的交换
    目录常规实现两个数的交换(如:交换变量a和变量b)方法一:加减法方法二:异或操作符常规实现两个数的交换(如:交换变量a和变量b)创建一个临时变量tmp,先将其中一个变量a存放在临时变量tmp中,此时变量a的值则可被替换为变量b,然后再将b的值替换为tmp,此时变量a和变量b的值借助于变量tmp就......
  • 基于java+springboot+vue实现的毕业论文管理系统(文末源码+Lw)251
    摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本毕业论文管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效......
  • transformer在图像分类上的应用以及pytorch代码实现_transformer 图片分类
    本文简单介绍transformers的原理,主要介绍transformers如何应用在图像分类上的任务。1.对transformers的简单介绍transformers在自然语言处理领域有着天然的优势,transformers改进了RNN(循环神经网络)训练慢,不能够建立序列之间的长期依赖,记忆消失的缺点。transformers的核心......
  • 如何借助 LLM 设计和实现任务型对话 Agent
    1引言在人工智能的快速发展中,任务型对话Agent正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互,专注于高效执行特定任务,如预订酒店或查询天气。尽管市场上的开源框架如Rasa和MicrosoftBotFramework在对话理解和管理方面已经取得了不错的进展,但仍......
  • Java语言助力企业实现个人信息的实名认证
    如今,人工智能发展迅速,任何经营活动,都难免会跟个人信息打交道,那么,什么是个人信息呢?有人认为,以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。包括姓名、出生日期、身份证件号码、个人生物识别信息、住址、通信通......
  • Java实现管线拓扑关系连通性分析
    管线拓扑关系的连通性分析通常涉及图论(GraphTheory)中的概念,特别是无向图(UndirectedGraph)的遍历算法,如深度优先搜索(DFS,Depth-FirstSearch)或广度优先搜索(BFS,Breadth-FirstSearch)。在管线拓扑中,管线可以被视为图的边(Edge),而管线的连接点可以被视为图的节点(Vertex)。连通性分析......
  • Java Script-使用DOM编程实现移动坦克
    要求:实现:将坦克图片放在页面上:<imgid="mytank"src="./img/right.png"/>在css中设置坦克的初始位置以及页面背景:<styletype="text/css">    input{font-size:26px;margin-top:20px;}    body{background-image:url("./img/gra......
  • 03栈与队列
    栈当n个不同元素进栈时,出栈元素不同排列的个数为$$\frac{1}{n+1}C_{2n}^{n}=\frac{(2n)!}{(n+1)!n!}$$该公式为卡特兰数(Catalan)公式栈的输出序列如果输入次序是顺序输入,可以观察最先一个输出的元素,若最先输出的是最后输入的元素,则输出序列一定是倒序且唯一共享栈栈......
  • python创建websocket服务器,实现循环发送消息
    WebSocket协议是在2008年由Web应用程序设计师和开发人员创建的,目的是为了在Web浏览器和服务器之间提供更高效、更低延迟的双向通信。它允许客户端和服务器在任何时候发送消息,无需重新建立TCP连接。WebSocket可以在Web浏览器和服务器之间传输文本和二进制数据,使得构建实时Web......
  • GBase 8s 通过systemd实现自启动与关闭
    在RHEL7/CENTOS7/SUSE12及最新的Ubuntu等linux发行版本中,均使用systemd进行服务控制管理(ServiceControlManager)。使用systemd,不再需要编写shell脚本程序来控制启动、关闭。以下是通过systemd方式实现GBase8s数据库的自启动与关闭。适用于操作系统:RHEL7/CENTOS7,以及......