队列的特性及代码实现(C语言)

目录

队列的定义

队列的实现分析

代码实现

Queue.h

Queue.c


队列的定义

        队列是只允许在一端进行插入操作,而在另一段进行删除操作的线性表。

        首先,让我们来看一看生活中的队列,当我们去银行办理业务的时候,我们进入银行的时候,都会去取票机那里去一个专属我们的序号,当客服通过语音播报的时候,如果是我们手里拿的好嘛时,就轮到我们办理业务了。这是一种非常公平的方法,先来的人先办理业务,后来的人就只能等到前面的人办理完业务之后才到你。这种方法是非常公平的。

        我们再来看一个例子,当我们在玩电脑的时候,当电脑不知道是什么原因卡死的时候。我们可能会疯狂的点击左键,想要把我们进行的操作点出来,可是电脑却没有反应。可是过了一会,电脑突然不卡了,你就会发现出现了很多很多同样的应用或者网页,这就是当我们点击鼠标时,鼠标已经把信息传给了电脑,每一个操作都在排队等待被进行,所以说会出现很多相同的应用或者网页。

        我们可以看到,队列就像是一个单向通道,只能向前走,不能后退。

        队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端叫做队尾,允许删除的一端叫做队头。

队列的实现分析

        队列也有着两种实现方式,一种是链式结构,一种是顺序结构。相比于栈实现我们用的顺序结构,在队列中我们用链式结构来实现要好一点。

        队列使用顺序表实现的弊端:当我们从队头出数据的时候,需要改变队头的指向,随着删除的数据增多,就会出现多余的空间浪费,这是我们就需要定义一个循环队列了,而循环队列的大小是固定的,操作起来又会很不方便,所以说我们选择使用链式结构来实现队列。

        队列的链式储存结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。因为队列只在头和尾进行操作,所以说我们只需要定义两个指针,一个指向头,一个指向尾就行了。队列的插入与删除也很方便,我们只需要将删除的节点释放掉,改变头指针的指向就行,插入的时候我们只需要改变尾指针的指向就可以了。

        分析了这么多,下面就让我们来实现一下代码吧。

代码实现

Queue.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//函数声明 结构体声明
//定义数据类型
typedef int datatype;

//定义节点
typedef struct QNode
{
	datatype data;

	struct QNode* next;
}QNode;


typedef struct Queue
{	
	//头节点
	QNode* head;

	//尾节点
	QNode* tail;
}Queue;

//队列初始化
void InitQueue(Queue* sp);

//队列插入 (头删尾插)
void InsertQueue(Queue* tmp);

//出队列
void  PopQueue(Queue* tmp);

//销毁队列
void  DestroyQueue(Queue* tmp);

//队头数据
datatype FrontQueue(Queue* tmp);

//队尾数据
datatype BackQueue(Queue* tmp);

//队列长度
int QueueSize(Queue* tmp);

//队列是否为空
bool QueueEmpty(Queue* tmp);

Queue.c

#include "Queue.h"

//函数实现

//队列初始化
void InitQueue(Queue* sp)
{	
	assert(sp);

	sp->head = NULL;
	sp->tail = NULL;
}

//链表插入 (头删尾插)
void InsertQueue(Queue* tmp,datatype x)
{
	assert(tmp);

	QNode* cur = (QNode*)malloc(sizeof(QNode));
	if (cur == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	cur->data = x;
	cur->next = NULL;

	//如果是空队列,先直接赋值
	if (tmp->tail ==NULL)
	{
		tmp->head = cur;
		tmp->tail = cur;
	}
	//如果不是空队列,就尾插
	else
	{
		tmp->tail->next = cur;

		tmp->tail = cur;
	}
}


//出队列
void  PopQueue(Queue* tmp)
{
	assert(tmp);
	//队列的头不能为空
	assert(tmp->head);

	//只有一个节点的情况
	if (tmp->head->next==NULL)
	{	
		free(tmp->head);
		tmp->head =tmp->tail= NULL;
	}
	//不只有一个节点的情况
	else
	{	
		QNode* cur = tmp->head->next;
		free(tmp->head);
		tmp->head = cur;

	}
}

//队头数据
datatype FrontQueue(Queue* tmp)
{
	assert(tmp);
	assert(tmp->head);

	return tmp->head->data;
}

//队尾数据
datatype BackQueue(Queue* tmp)
{
	assert(tmp);
	assert(tmp->tail);

	return tmp->tail->data;
}


//队列长度
int QueueSize(Queue* tmp)
{
	int count = 0;
	QNode* cur = tmp->head;
	//遍历队列
	while (cur)
	{	
		count++;
		cur = cur->next;
	}
	//返回长度
	return count;
}


//队列是否为空
bool QueueEmpty(Queue* tmp)
{	
	//是空返回true  不是空返回false
	return tmp->head == NULL;
}


//销毁队列
void  DestroyQueue(Queue* tmp)
{
	assert(tmp);

	QNode* del = tmp->head;
    //释放节点
	while (del)
	{
		QNode* cur = del->next;

		free(del);
		del = cur;
	}
	del = NULL;
	tmp->head = tmp->tail = NULL;
}

        以上就是关于队列的实现以及我对队列的一些理解,如果有什么错误还请大家指出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TPK系列——2W 3KVDC 隔离单,双输出 DC/DC 电源模块

TPK系列是一款2W并且有高隔离电压要求的理想产品&#xff0c;工业级温度范围–40℃到 105℃&#xff0c;在此温度范围内都可以稳定输出2W&#xff0c;并且效率非常高&#xff0c;高达89%&#xff0c;同时负载调整率非常低&#xff0c;对于有输出电压精度有要求的地方特别合适&a…

服务案例|网络攻击事件的排查与修复

LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警&#xff0c;Trap是一种主动推送网络设备事件或告警消息的方式&#xff0c;与SNMP轮询&#xff08;polling&#xff09;不同&#xff0c;具有以下几点优势&#xff1a; 1. 实时监控与快速响应 SNMP Trap能够实时…

LeetCode 518.零钱兑换Ⅱ

思路&#xff1a; 这题和之前做的不大一样&#xff0c;之前的动态规划转化成背包问题一般都是求能放入的最大重量&#xff0c;这个是求组合数。 求组合数的状态转移方程之前在1和0提到过&#xff1a; dp[j]dp[j-nums[]i]; 这里重点分析一下遍历顺序&#xff1a; 这段代码里面是…

vue学习汇总

目录 一、vue基本语法 1.插值表达式 {{}} 2.显示数据(v-text)和(v-html) 3.事件处理(v-on) 4.循环遍历(v-for) 5.判断语法(v-if) 6.元素显示与隐藏(v-show) 7.动态设置属性(v-bind) 8.数据双向绑定(v-model) 9.计算属性 二、vue组件 1.使用组件的三个步骤 2.注册组…

Spring Boot发送邮件时如何支持定时功能?

如何使用Spring Boot结合AokSend以实现高效邮件发送&#xff1f; 如何高效地进行sendmail发送邮件并支持定时功能是一个值得探讨的问题。本文将详细介绍如何在Spring Boot中实现定时sendmail发送邮件&#xff0c;并结合AokSend工具实现高效邮件发送。 Spring Boot发送邮件&am…

【Go专家编程——并发控制——三剑客】

并发控制 我们考虑这么一种场景&#xff0c;协程在A执行过程中需要创建子协程A1、A2、A3…An&#xff0c;协程创建完子协程后就等待子协程退出。 针对这种场景&#xff0c;Go提供了三种解决方案&#xff1a; Channel&#xff1a;使用channel控制子协程 优点&#xff1a;实现…

6.1 Go 数组

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Spring Cloud Alibaba-06-Sleuth链路追踪

Lison <dreamlison163.com>, v1.0.0, 2024.4.03 Spring Cloud Alibaba-06-Sleuth链路追踪 文章目录 Spring Cloud Alibaba-06-Sleuth链路追踪为什么使用链路追踪常见链路追踪解决方案Sleuth概述概述Sleuth术语 Sleuth Zipkin 原理Sleuth原理简述Zipkin 原理简述 Sleut…

永恒之蓝(MS17-010)详解

这个漏洞还蛮重要的&#xff0c;尤其在内网渗透和权限提升。 目录 SMB简介 SMB工作原理 永恒之蓝简原理 影响版本 漏洞复现 复现准备 复现过程 修复建议 SMB简介 SMB是一个协议服务器信息块&#xff0c;它是一种客户机/服务器、请求/响应协议&#xff0c;通过SMB协议…

[ARM-2D 专题] 1.开始:基本工程搭建,编译和开发环境配置问题解决

要开始使用ARM-2D&#xff0c;前期两个准备工作需要完成&#xff1a; 一块mcu内核为cortex-M的板子&#xff0c;带显示屏&#xff08;彩色TFT屏&#xff0c;分辨率建议320x240或以上&#xff0c;带TP更佳&#xff09;。基于这个板子可以正常运行的keil MDK的工程。 好了&#…

科技守护,河流水文监测保障水资源安全!

中小河流是城乡水资源的补给&#xff0c;又是不可或缺的排放渠道&#xff0c;维系着城乡水资源的平衡与生态的健康。然而&#xff0c;随着工业化、城市化的快速推进&#xff0c;河流生态环境面临着越来越大的压力。为了有效保护和合理利用河流资源&#xff0c;河流水文监测成为…

vs code 中使用SSH 连接远程的Ubuntu系统

如下图&#xff0c;找到对应的位置 在电脑上找到以下位置 打开配置如下&#xff0c;记住&#xff0c;那个root为你的用户名&#xff0c;这个用户名&#xff0c;具体根据你的用户名来设置&#xff0c;对应的密码就是你登录Ubuntu时的密码 Host root192.168.0.64User rootHostNa…

第98天:权限提升-WIN 全平台MSF 自动化CS 插件化EXP 筛选溢出漏洞

目录 思维导图 前置知识 案例一&#xff1a; Web&Win2008-人工手动&全自动msf-筛选&下载&利用 手动 全自动msf 案例二: Web&Win2019-CS 半自动-反弹&插件&利用 思维导图 前置知识 提权方式&#xff0c;这里讲的是溢出漏洞 windows权限 常…

实时合成 1 秒频订单簿快照:DolphinDB INSIGHT 行情插件与订单簿引擎应用

INSIGHT 是华泰证券依托大数据存储、实时分析等领域的技术积累&#xff0c;整合接入国内多家交易所高频行情数据&#xff0c;为投资者提供集行情接入、推送、回测、计算及分析等功能于一体的行情数据服务解决方案。基于 INSIGHT 官方提供的行情数据服务 C SDK&#xff08;TCP 版…

HTML静态网页成品作业(HTML+CSS)——动漫海贼王介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

超分论文走读

codeFormer 原始动机 高度不确定性&#xff0c;模糊到高清&#xff0c;存在一对多的映射纹理细节丢失人脸身份信息丢失 模型实现 训练VQGAN 从而得到HQ码本空间作为本文的离散人脸先验。为了降低LQ-HQ映射之间的不确定性&#xff0c;我们设计尽量小的码本空间和尽量短的Code…

人人都是产品经理,尼恩产品经理面试宝典(史上最全、定期更新)

《人人都是产品经理&#xff0c;尼恩产品经理面试宝典》&#xff08;史上最全、定期更新&#xff09; 本文版本说明&#xff1a;V1 IT不老新物种 的定义 大龄男IT &#xff1a;APM 架构经理 项目经理 高级开发&#xff0c;没有中年危机 大龄女IT&#xff1a;DPM 产品经理 …

Simulink从0搭建模型07-P8for循环的使用

Simulink从0搭建模型07-P8for循环的使用 今日学习内容1. For Iterator Subsystem模块介绍1.1. 累加器1.2. For Iterator1.3.小结 2. states介绍3. Set next i&#xff08;相当break)学习心得 今日学习内容 b站视频 【Simulink 0基础入门教程 P8 for循环的使用 For Itrator Sub…

Power Bi 自定义进度条,圆角框,矩阵图标的实现

最近项目在做Power BI&#xff0c;我总结了几个常用的自定义样式&#xff0c;分享一下做法。 比如我们要实现如图这样的一个样式&#xff1a; 这包含了一个带文字的自定义进度条&#xff0c;矩阵有树型展开以及图标显示&#xff0c;最外面有圆角框包围。我觉得这几个样式出现…

ATA-2021B高压放大器在锂电池超声检测中的应用

锂电池一种高能量密度的电池&#xff0c;已经广泛应用于可穿戴设备、移动电话、笔记本电脑和电动汽车等领域中。然而&#xff0c;其在使用过程中存在着一定的安全隐患&#xff0c;锂电池内部的化学反应和充放电过程可能会导致电池发热&#xff0c;甚至发生燃烧。Aigtek安泰电子…