队列的特性及代码实现(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  不是空返回falsereturn 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.mzph.cn/news/845938.shtml

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

相关文章

Python的第三方库OS库

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;OS/SHUTIL 的方法描述&#x1f680;OS/SHUTIL…

Golang 协程和 Channel 的协同工作

在 Golang 中&#xff0c;协程&#xff08;goroutine&#xff09;和通道&#xff08;channel&#xff09;是并发编程的两大支柱。协程是一种轻量级的线程&#xff0c;而通道则是协程之间进行通信的管道。在本文中&#xff0c;我们将通过一个简单的示例来深入理解它们是如何协同…

GPT-4o:突破与革新

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅速发展&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;GPT系列模型表现尤为突出。随着OpenAI不断推出新版本&#xff0c;GPT-4o作为最新成员&#xff0c;再次引起广泛关注。本文将对…

不同linux账户切换不同的cuda版本

原因 由于服务器中安装了两个版本的cuda&#xff08;cuda10.1和cuda11.1&#xff09;&#xff0c;不同项目可能需要应用不同的cuda版本&#xff0c;但是自己又没有root权限或者只想在使用指定conda环境时改为用指定的cuda版本。总结起来有三种方法&#xff1a; 1、修改软链接指…

新游启航 失落的方舟台服注册指南 一文教会你方舟台服注册

新游启航&#xff01;失落的方舟台服注册指南&#xff01;一文教会你方舟台服注册 失落的方舟作为本月最受期待游戏之一&#xff0c;在上线之际许多玩家已经有点急不可待了。这款游戏是由开发商Smile gate开发的一款MMORPG类型游戏&#xff0c;这款游戏的基本玩法与其他MMORPG…

理解AdaBoost算法:简单流程概述(一)【流程理解、无数学推导】

什么是AdaBoost 算法&#xff1f; AdaBoost&#xff08;Adaptive Boosting&#xff09;算法&#xff0c;全称为 自适应提升 &#xff0c;是 一种在机器学习中用作集成方法的提升技术 。它之所以被称为自适应提升&#xff0c;因为每个实例的权重会重新分配&#xff0c;错误分类…

前端面试题日常练-day47 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. 在Bootstrap中&#xff0c;以下哪个类用于创建一个具有响应式的栅格系统&#xff1f; a) .grid-system b) .responsive-grid c) .container-fluid d) .grid-responsive 2. 哪个Bootstrap类用于创…

Python 关于编码与解码

在Python中&#xff0c;字符串的编码和解码是处理字符串与字节之间转换的重要操作。 常见的字符串编码方式包括以下几种&#xff1a; ASCII 编码&#xff08;American Standard Code for Information Interchange&#xff09;&#xff1a;ASCII 是最早的字符编码标准&#xf…

推荐一个远程数据库 Supabase

地址&#xff1a;Supabase | The Open Source Firebase Alternative 使用文档&#xff1a; Supabase Docs

IO进程线程(三)文件IO之open/close read/write lseek

一、文件IO &#xff08;一&#xff09;概念 文件IO就是系统调用&#xff0c;用户空间进入内核空间的过程就是系统调用。 系统调用没有缓冲机制&#xff0c;效率较低&#xff0c;可移植性也相对较差&#xff0c;实时性高。 文件描述符是使用open函数打开文件时的返回值&…

NIUSHOP开源商城单商户V6版本:前端技术架构的深度解析

摘要&#xff1a; 本文将对NIUSHOP开源商城单商户V6版本的前端技术架构进行深度解析。NIUSHOP V6版本以其强大的多应用多插件组合设计理念、前后端完全分离的技术架构&#xff0c;以及支持多语言、多平台等特点&#xff0c;受到了市场的广泛好评。本文将详细介绍其前端技术栈的…

HOW - BFF 服务实践系列(一)

目录 一、BFF 介绍1.1 BFF 的概念1.2 为什么需要 BFF1.3 举例说明 二、适用于Web前端的BFF应该提供哪些能力2.1 接口聚合&#xff08;重要&#xff09;2.2 简化和优化的API2.3 安全和身份验证&#xff08;重要&#xff09;2.4 缓存机制2.5 错误处理和重试机制2.6 数据格式转换2…

【算法】贪心算法简介

贪心算法概述 目录 1.贪心算法概念2.贪心算法特点3.贪心算法学习 1.贪心算法概念 贪心算法是一种 “思想” &#xff0c;即解决问题时从 “局部最优” 从而达到 “全局最优” 的效果。 ①把解决问题的过程分为若干步②解决每一步时候&#xff0c;都选择当前最优解(不关注全局…

RDD实战:排序算子 - sortBy()

在本实战案例中&#xff0c;我们将使用Apache Spark的sortBy()算子来对一个包含学生信息的RDD进行排序操作。 排序规则如下&#xff1a; 首先按照性别升序排列。在性别相同的情况下&#xff0c;按照年龄降序排列。 步骤1&#xff1a;创建学生信息列表 首先&#xff0c;我们创…

基于51单片机和NRF24L01的无线温度监控设计

一、设计功能 由单片机、温度传感器、无线模块NRF24L01以及液晶显示器等构成高精度远 程无线温度监测系统。 温度显示精确到小数点后一位。 按键设定过温值&#xff0c;过温在液晶屏提示。 系统设计 三、器件选择3.1温度信号采集模块 传统的温度检测大多以热敏电阻为传感器&a…

【C++】list的使用(上)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f308;关于list&#x1f525;默认成员函数构造函数&#xff08;constructor&#xff09;析构函数&#xff08;destructor&#xff09;赋值运算符重载 &#x1…

从技术底层超主层依次介绍大模型

目录 # 如何让大模型更聪明&#xff1f; 一、GPT大模型基本概念 二、大模型生态介绍 三、简单描述如何让大模型变得更加聪明 # 如何让大模型更聪明&#xff1f; 一、GPT大模型基本概念 前景&#xff1a; 40年一遇的技术变革&#xff1b;被优化的人口&#xff0c;在未来十…

五分钟“手撕”栈

实现代码放开头&#xff0c;供大家学习与查阅 目录 一、实现代码 二、什么是栈 三、栈的常见操作 底层实现是链表。 入栈 出栈 四、Stack的使用 五、栈的习题 第一题 第二题 第三题 第四题 第五题 第六题 第七题 六、栈、虚拟机栈、栈帧的区别 目录 一、…

Request

一、Request介绍 在计算机网络中&#xff0c;"Request"&#xff08;请求&#xff09;通常指的是客户端向服务器发送的请求消息&#xff0c;用于获取特定资源或执行特定操作。在Web开发中&#xff0c;"Request"通常指的是HTTP请求&#xff0c;用于客户端与服…

速盾:香港服务器可以用cdn吗?

香港是一个互联网发达的地区&#xff0c;拥有优质的网络基础设施和大量的服务器机房。对于网站和应用开发者来说&#xff0c;选择一个合适的服务器位置是十分重要的。CDN&#xff08;内容分发网络&#xff09;是一种能够通过分布在全球各地的服务器节点来加速访问速度的技术&am…