【数据结构】——队列

news2024/11/16 20:56:10

文章目录

  • 前言
  • 一.什么是队列,队列的特点
  • 二、队列相关操作
    • 队列的相关操作声明
    • 队列的创建
    • 1.队列的初始化
    • 2.对队列进行销毁
    • 3.判断队列是否为空队列
    • 4.入队操作
    • 5.出队操作
    • 6.取出队头数据
    • 7. 取出队尾数据
    • 8.计算队伍的人数
  • 总结


前言

本文章讲述的是数据结构的特殊线性表——队列


一.什么是队列,队列的特点

队列是数据结构中的一种特殊的线性表,它与栈不同,

在这里插入图片描述
队列的基本图例如上图:
显然,队列的特点就是:
先进先出
First In First Out
那么我们使用什么样的方式来实现队列呢?

基于队列的特点,使用链表而不是数组来实现队列是比较合适的
使用数组来实现队列的缺点:

出队时需要挪动数据,效率不高。

使用链表来实现队列的优点:入队出队效率高,不需要挪动数据。
使用链表来进行入队出队时,就需要链接起来和释放节点,所以我们最好定义头指针和尾指针指向队头和队尾。

把头指针和尾指针放在一个结构体中,更方便操作,如下图:

在这里插入图片描述

二、队列相关操作

队列的相关操作声明

void QueueInit(Queue* pq);//初始化队列

void QueueDestroy(Queue* pq);//销毁队列

void QueuePush(Queue* pq,QDataType x);//插入数据

void QueuePop(Queue* pq);//删除数据

int QueueSize(Queue* pq);//记录队列有多少人

bool QueueEmpty(Queue* pq);//判断队列是否为NULL

QDataType QueueFront(Queue* pq);//取出队头数据

QDataType QueueBack(Queue* pq);//取出队尾数据

队列的创建


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

typedef int QDataType;
//队列更适合用链表写,因为如果用顺序表来写,出列的时候需要挪动数据

typedef struct QueueNode
{
	QDataType data;
	struct QueueNode* next;
}QNode;
//队伍的每个人的结构体

typedef struct Queue
{
	struct QueueNode* head;
	struct QueueNode* tail;
}Queue;
指向队头和队尾的两个指针放在一个结构体里面

1.队列的初始化

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
}

初始化指向队头和队尾的两个指针为NULL

2.对队列进行销毁

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
}

3.判断队列是否为空队列

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

4.入队操作

解读:队列的实现方式是链表,不需要检查容量不足,每入队一个人就申请一个节点即可

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	assert(newnode != NULL);
	newnode->data = x;
	newnode->next = NULL;

	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	//第一次入队的时候,就作为队头,头指针指向它
	pq->tail->next = newnode;
	pq->tail = newnode;

}

5.出队操作

//记住队列是先进先出,所以队头先出
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));//队头为空,说明删完了
	QNode* newhead = pq->head->next;//先记录队头的下一个人
	
	//删到最后的时候,tail没有置空,是野指针,所以这里要判断
	if (newhead == NULL)
	{
		pq->tail = NULL;
	}

	free(pq->head);
	pq->head = newhead;
}

6.取出队头数据

注意出队的时候,并没有拿出该人数的节点的值

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}

7. 取出队尾数据

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}

8.计算队伍的人数

int QueueSize(Queue* pq)
{
	assert(pq);
	int size = 0;
	QNode* cur = pq->head;
	while (cur)
	{
		++size;
		cur = cur->next;
	}
	return size;
}

总结

文章讲述简单队列的实现,复杂队列后续会讲。

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

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

相关文章

Python3 错误和异常实例及演示

作为 Python 初学者&#xff0c;在刚学习 Python 编程时&#xff0c;经常会看到一些报错信息&#xff0c;在前面我们没有提及&#xff0c;这章节我们会专门介绍。 Python 有2种错误很容易辨认&#xff1a;语法错误和异常。 Python assert&#xff08;断言&#xff09;用于判断…

通信算法之一百零四:QPSK完整收发仿真链路

1.发射机物理层基带仿真链路 1.1 % Generates the data to be transmitted [transmittedBin, ~] BitGenerator(); 2.2 % Modulates the bits into QPSK symbols modulatedData QPSKModulator(transmittedBin); 2.3 % Square root Raised Cosine Transmit Filter %comm…

SpringBoot参数请求处理

一、请求映射 请求映射原理 DispatcherServlet 继承了 FrameworkServlet(抽象类&#xff0c;继承了 HttpServletBean&#xff0c;实现了 ApplicationContextAware 接口)&#xff0c;重写了 doService() 方法 在 doService() 方法里定义了 doDispatch() 方法&#xff1b;doDi…

概论_第7章_参数估计_真题__求置信区间

真题 2014.10 第30题 测量某物体的质量9次&#xff0c; 测得平均值 x‾15.4\overline x 15.4x15.4 g, 已知测量数据 XXX ~ N(μ,0.09)N(\mu, 0.09)N(μ,0.09) (1) 求该物体质量的置信度为0.95 的置信区间&#xff1b; &#xff08;2&#xff09;为了使置信度为0.95 的置信区间…

20 堆排序

文章目录1 堆排序的概念2 堆排序基本思想3 堆排序步骤图解说明4 堆排序的代码实现1 堆排序的概念 1) 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最坏&#xff0c;最好&#xff0c;平均时间复杂度均为 O(nlogn)&#xf…

Spring中BeanPostProcessor与循环依赖的问题

Spring中后置处理器与循环依赖的问题 在Spring的bean生命周期中, 我们可以通过实现BeanPostProcessor来对bean初始化前后做操作, 在网上的许多帖子博客中, 不乏可以看见说Spring的AOP是在后置处理器中实现的, 这个理解显然有失偏颇, 很容易误导一般人在后置处理器中对原先的be…

Android 一帧绘制流程分析笔记

和你一起终身学习&#xff0c;这里是程序员Android经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点:一、显示一帧流程概览二、生产者&#xff0c;消费者 BufferQueue 流转图三、App &#xff0c;SF Buffer 交互图四、SF 跟 HWC 交互图一、显示一帧流程概览…

16.CSS中使用颜色

使用颜色 在计算机中&#xff0c;传统的模型之一为RGB模型&#xff0c;所有颜色都是通过红色、蓝色、绿色三种颜色进行组合&#xff1b;我们通过数值去表示 例如&#xff1a; 红色&#xff08;255.0.0&#xff09;、蓝色&#xff08;0.0.255&#xff09;、绿色&#xff08;0.…

在IDEA中配置jeesite-(文章链接汇总)

建议按照文章顺序操作 原文里可以下载geesite项目 jeesite-github原文链接 jeesite-gitee原文链接–国内推荐 可 直 接 跳 到 此 步 骤 环境准备&#xff1a;JDK 1.8 or 11、17、Maven 3.6、使用 MySQL 5.7 or 8.0 数据库 1-Maven的下载安装配置教程&#xff08;详细图文&am…

Vue3之循环渲染

1.何为循环渲染 在Vue3中&#xff0c;当我们需要渲染一个数组中的数据到dom元素上时&#xff0c;就需要使用循环渲染。循环渲染可以节约我们大量重复冗余的工作&#xff0c;比如我们去渲染一个下拉菜单的时候&#xff0c;如果不使用循环渲染&#xff0c;那么我们需要手动一项一…

2023美赛C代码思路结果【全部更新完毕】注释详尽

C题已完成全部代码&#xff0c;注释详尽&#xff0c;并增加扰动项&#xff0c;保证大家的结果不会撞 需要全部问题的可以点击&#xff1a;https://www.jdmm.cc/file/2708697/ 下面贴出核心代码&#xff1a; -- coding: utf-8 -- TODO: 入口函数 import numpy as np from…

Mr. Cappuccino的第43杯咖啡——Kubernetes之Pod控制器(二)

Kubernetes之Pod控制器Horizontal Pod Autoscaler&#xff08;HPA&#xff09;安装metrics-server创建Pod创建HPA压力测试JobCronJobHorizontal Pod Autoscaler&#xff08;HPA&#xff09; 上篇文章中所说的ReplicaSet和Deployment&#xff0c;我们已经可以通过手动执行kubec…

Shiro1.9学习笔记

文章目录一、Shiro概述1、Shiro简介1.1 介绍1.2 Shiro特点2、Shiro与SpringSecurity的对比3、Shiro基本功能4、Shiro原理4.1 Shiro 架构(外部)4.2 shiro架构(内部)二、Shiro基本使用1、环境准备2、登录认证2.1 登录认证概念2.2 登录认证基本流程2.3 登录认证实例2.4 身份认证源…

WordPress网站伪静态及固定链接设置教程

WordPress网站伪静态及固定链接设置教程-解决404错误问题!搭建好WordPress网站之后我个人建议首先要做的就是设置好固定链接&#xff0c;WordPress的固定链接也就是网站各个页面的链接格式&#xff0c;默认的方式不太符合现代化网站&#xff0c;推荐使用自定义的方案。既然涉及…

良许翻天覆地的2022年

大家好&#xff0c;我是良许&#xff0c;新年快乐呀~ 在我女室友坚持不懈的努力之下&#xff0c;2022年的最后一天我终于被她传染了&#xff0c;阳了~ 此时的我&#xff0c;正顶着37多度的低烧写下这篇年终总结。 2022年&#xff0c;对于大多数人而言&#xff0c;封控是主旋…

Git使用小乌龟克隆与推送代码Gitee--零命令行(组员版本)

目录 上一篇文章&#xff08;必读&#xff01;&#xff01;&#xff01;&#xff09; 概述 分支概念&#xff08;权限分配&#xff09;&#xff1a; 总体操作思想&#xff1a; 操作步骤 一、组员第一天上班&#xff08;云端仓库代码克隆到本地仓库进行代码编写&#xff…

网日志处理中的应用架构-《大数据时代的IT架构设计》

用户的上网行为中蕴含着大量的客户特征和客户需求信息&#xff0c;这些信息至关重要,这就要求用户的上网日志记录必须被保存&#xff0c;而且还需要进行数据分析挖掘处理&#xff0c;然后根据处理结果定义用户的行为习惯&#xff0c;为电信运营商实现精细化运营提供重要的营销依…

【数据库】Clickhouse 实践之路

文章目录背景Clickhouse简介为什么选择ClickhouseClickhouse特性Clickhouse建设整体架构数据接入层数据存储层数据服务层数据应用层Clickhouse运维管理平台配置文件结构元数据管理自动化运维用户管理集群操作监控与报警Clickhouse应用BI查询引擎核心诉求选型对比集群构建问题及…

基于jeecgboot的flowable流程设计器的几个bug修复

因为今天在用任务监听器的时候&#xff0c;出现几个bug&#xff0c;所以一并修复与处理。 一、建立任务监听器后&#xff0c;删除不了 主要有两个原因&#xff0c;一个是点击删除没反应&#xff0c;实际上是弹出框跑到后面去了&#xff0c;说明还是z-index问题&#xff0c;调整…

.Net Core中使用NEST简单操作Elasticsearch

C#中访问Elasticsearch主要通过两个包NEST和Elasticsearch.Net&#xff0c;NEST用高级语法糖封装了Elasticsearch.Net可以通过类Linq的方式进行操作&#xff0c;而Elasticsearch.Net相比之下更为原始直接非常自由。注意&#xff1a;ES的8.X以上的版本有新的包Elastic.Clients.E…