1.队列的定义:

队列(Queue)是一种基础且重要的线性数据结构,遵循先进先出(FIFO)​​ 原则,即最早入队的元素最先出队,与栈不同的是出队列的顺序是固定的。队列具有以下特点:

  1. FIFO原则​:元素按插入顺序处理,队头(Front)删除,队尾(Rear)插入。
  2. 操作受限​:仅允许在两端操作(队尾入队、队头出队),中间元素不可直接访问
  3. 顺序队列(数组实现)​
    - ​优点​:内存连续,访问高效。
    - ​缺点​:易“假溢出”(数组未满但指针越界),需通过循环队列优化:
    - 队尾指针循环:rear = (rear + 1) % size
    - 队满条件:(rear + 1) % size == front(牺牲一个存储单元)。
    链式队列(链表实现)​
    - ​优点​:动态扩容,无固定大小限制

2. 队列的实现:

首先我们打开visual studio,我们需要准备以下界面:
在这里插入图片描述

2.1 queue.h代码

其中queue.h主要是存放函数的调用的头文件,内容如下:

#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
#define QDataType int struct QueueNode 
{QDataType data;struct QueueNode* next;//定义 next指针//我们可以尝试使用单链表来完成 
};
typedef struct QueueNode QNode;struct queue
{QNode* phead;QNode* ptail;int size;//为什么需要通过结构体来封装两个指针//原本需要通过二级指针来完成增加和删除
};
typedef struct queue queue;
//上述完成结构体基本建设//接下来完成以下接口:
//初始化和销毁
void QueueInit(queue* pq);
void QueueDestroy(queue* pq);//后增和前删
void QueuePush(queue* pq, QDataType x);
void QueuePop(queue* pq);//取出之前的数和取出后面的数 
QDataType QueueFront(queue* pq);
QDataType QueueBack(queue* pq);//返回队列中有效值个数
int QueueSize(queue* pq);//判空
bool QueueEmpty(queue* pq);

这一块代码是栈的头文件,我们给出接口,接下来我们要尝试在stack.c里面实现这些代码,即这些头文件的接口具体如何实现

1.2 queue.c代码

#include"queue.h"void QueueInit(queue* pq)
{pq->phead = pq->ptail = NULL;pq->size = 0;
}void QueueDestroy(queue* pq)
{QNode* pcur = pq->phead;while (pcur){QNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;
}void QueuePush(queue* pq, QDataType x)
{QNode* tmp = (QNode*)malloc(sizeof(QNode));if (tmp == NULL){perror("malloc fail");return;}tmp->data = x;tmp->next = NULL;if (pq->phead == NULL){//如果没有初始化pq->phead = tmp;pq->ptail = tmp;pq->size++;}else {pq->ptail->next = tmp;pq->ptail = tmp;pq->size++;}
}void QueuePop(queue* pq)
{assert(pq);QNode* Pop = pq->phead;pq->phead = pq->phead->next;free(Pop);pq->size--;
}QDataType QueueFront(queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->data;
}QDataType QueueBack(queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->data;
}int QueueSize(queue* pq)
{assert(pq);return pq->size;
}bool QueueEmpty(queue* pq)
{assert(pq);return pq->size == 0;
}

我们通过编写依次完成了这些代码的编写。我们接下来测试这些代码是否正常源代码如下:

#include"queue.h"void test1(queue* pq)
{QueueInit(pq);QueuePush(pq,1);QueuePop(pq);QueuePush(pq, 1);QueuePush(pq, 2);QueuePush(pq, 3);printf("%d ", QueueBack(pq));printf("%d ", QueueFront(pq));printf("%d",  QueueSize(pq));QueueDestroy(pq);
}int main()
{queue q1;test1(&q1);
}

尝试利用代码来调试看看我们完成的接口是否有问题:
在这里插入图片描述

目前来看是没有问题的。

3 总结:

队列以其严格的FIFO特性和高效的操作,成为管理有序任务的理想工具。理解其实现差异(循环队列 vs 链式队列)和应用场景(调度、缓冲、BFS等),能显著提升系统设计能力。实际开发中需根据数据规模​(静态/动态)、性能需求​(时间/空间复杂度)和并发环境选择合适的实现方式

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

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

相关文章

C#开发基础之深入理解“集合遍历时不可修改”的异常背后的设计

前言 欢迎关注【dotnet研习社】&#xff0c;今天我们聊聊一个基础问题“集合已修改&#xff1a;可能无法执行枚举操作”背后的设计。 在日常 C# 开发中&#xff0c;我们常常会操作集合&#xff08;如 List<T>、Dictionary<K,V> 等&#xff09;。一个新手开发者极…

【工具】图床完全指南:从选择到搭建的全方位解决方案

前言 在数字化内容创作的时代&#xff0c;图片已经成为博客、文档、社交媒体等平台不可或缺的元素。然而&#xff0c;如何高效、稳定地存储和分发图片资源&#xff0c;一直是内容创作者面临的重要问题。图床&#xff08;Image Hosting&#xff09;作为专门的图片存储和分发服务…

深度学习篇---PaddleDetection模型选择

PaddleDetection 是百度飞桨推出的目标检测开发套件&#xff0c;提供了丰富的模型库和工具链&#xff0c;覆盖从轻量级移动端到高性能服务器的全场景需求。以下是核心模型分类、适用场景及大小选择建议&#xff08;通俗易懂版&#xff09;&#xff1a;一、主流模型分类及适用场…

cmseasy靶机密码爆破通关教程

靶场安装1.首先我们需要下载一个cms靶场CmsEasy_7.6.3.2_UTF-8_20200422,下载后解压在phpstudy_pro的网站根目录下。2.然后我们去访问一下安装好的网站&#xff0c;然后注册和链接数据库3.不知道自己数据库密码的可以去小皮面板里面查看4.安装好后就可以了来到后台就可以了。练…

【C语言】指针深度剖析(一)

文章目录一、内存和地址1.1 内存的基本概念1.2 编址的原理二、指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 指针类型的解读2.2.3 解引用操作符2.3 指针变量的大小三、指针变量类型的…

半导体企业选用的跨网文件交换系统到底应该具备什么功能?

在半导体行业的数字化转型过程中&#xff0c;跨网文件交换已成为连接研发、生产、供应链的关键纽带。半导体企业的跨网文件交换不仅涉及设计图纸、工艺参数等核心知识产权&#xff0c;还需要满足跨国协同、合规审计等复杂需求。那么&#xff0c;一款适合半导体行业的跨网文件交…

影刀RPA_初级课程_玩转影刀自动化_网页操作自动化

声明&#xff1a;相关内容来自影刀学院&#xff0c;本文章为自用笔记&#xff0c;切勿商用&#xff01;&#xff08;若有侵权&#xff0c;请联络删除&#xff09; 1. 基本概念与操作 1.1 正确处理下拉框元素&#xff08;先判断页面元素&#xff0c;后进行流程编制&#xff09;…

Spark初探:揭秘速度优势与生态融合实践

更多推荐阅读 Spark与Flink深度对比&#xff1a;大数据流批一体框架的技术选型指南-CSDN博客 LightProxy使用操作手册-CSDN博客 Sentry一看就会教程_sentry教程-CSDN博客 微前端架构解析&#xff1a;核心概念与主流方案特性对比_微前端方案对比-CSDN博客 目录 Spark为何比Hadoo…

详谈OSI七层模型和TCP/IP四层模型以及tcp与udp为什么是4层,http与https为什么是7层

一、网络模型&#xff1a;OSI七层 vs TCP/IP四层OSI七层模型 (理论参考模型):目的&#xff1a;提供一个标准化的理论框架&#xff0c;用于理解网络通信过程和各层的功能划分&#xff0c;促进不同厂商设备的互操作性。它是一个理想化的模型。分层 (从下到上):物理层&#xff1a;…

ClickHouse 高性能实时分析数据库-索引与数据跳过(查询的“瞬移”能力)

告别等待&#xff0c;秒级响应&#xff01;这不只是教程&#xff0c;这是你驾驭PB级数据的超能力&#xff01;我的ClickHouse视频课&#xff0c;凝练十年实战精华&#xff0c;从入门到精通&#xff0c;从单机到集群。点开它&#xff0c;让数据处理速度快到飞起&#xff0c;让你…

Jetpack - Room(Room 引入、Room 优化)

一、Room 引入 1、基本介绍 Room 在 SQLite 上提供了一个抽象层&#xff0c;以便在充分利用 SQLite 的强大功能的同时&#xff0c;能够流畅地访问数据库&#xff0c;官方强烈建议使用 Room 而不是 SQLite 2、演示 &#xff08;1&#xff09;Setting 模块级 build.gradle depend…

【江科大CAN】2.1 STM32 CAN外设(上)

2.1 STM32 CAN外设&#xff08;上&#xff09;2.1.1 STM32 CAN外设简介2.1.2 外围电路设计2.1.3 STM32 CAN内部结构2.1.4 发送流程详解2.1.5 接收流程详解2.1.6 关键配置位总结STM32 CAN外设讲解 大家好&#xff0c;欢迎继续观看CAN总线入门教程。本节开始&#xff0c;我们正式…

人工智能技术革命:AI工具与大模型如何重塑开发者工作模式与行业格局

引言&#xff1a;AI技术爆发的时代背景过去五年间&#xff0c;人工智能领域经历了前所未有的爆发式增长。从2020年GPT-3的横空出世到2023年多模态大模型的全面突破&#xff0c;AI技术已经从实验室走向了产业应用的前沿。开发者作为技术生态的核心推动者&#xff0c;其工作模式正…

傅里叶变换

傅里叶变换:运用频域的出发点就是能够将波形从时域变换到频域&#xff0c;用傅里叶变换可以做到这一点。有如下3种傅里叶变换类型&#xff1a;1.傅里叶积分(FI); 2.离散傅里叶变换(DFT); 3.快速傅里叶变换(FFT)。傅里叶积分是一种将时域的理想数学表达变换成频域描述的数学技术…

【IQA技术专题】纹理相似度图像评价指标DISTS

纹理一致性图像评价指标: Image Quality Assessment: Unifying Structure and Texture Similarity&#xff08;2020 PAMI&#xff09;专题介绍一、研究背景二、方法总览2.1 初始变换2.2 纹理表示和结构表示2.3 DISTS指标2.4 优化DISTS指标三、实验结果四、总结本文将对统一图像…

windows下Docker安装路径、存储路径修改

一、命令行指定安装路径​ ​​下载安装包​​&#xff1a;从Docker官网获取安装程序&#xff08;如Docker Desktop Installer.exe&#xff09;。​​运行PowerShell​​&#xff1a; & "H:\Docker Desktop Installer.exe" install --installation-dir"F:…

thingsboard 自定义动作JS编程

在 ThingsBoard 中实现 自定义动作&#xff08;Custom Action&#xff09;的 JavaScript 编程&#xff0c;主要通过“Custom action (with HTML template&#xff09;”方式完成&#xff0c;适用于创建弹窗、编辑实体、控制设备等交互行为。 实现步骤&#xff08;以添加设备或资…

Spring Boot 简单接口角色授权检查实现

一、背景与目标在Spring Boot应用开发中&#xff0c;接口级别的权限控制是系统安全的重要组成部分。本文将介绍一种简单直接的接口角色授权检查实现方案&#xff0c;适合快速开发和安全合规检查场景。二、技术方案概述本方案采用自定义注解拦截器的方式实现&#xff0c;具有以下…

PytorchLightning最佳实践日志篇

在 PyTorch Lightning&#xff08;PL&#xff09;中&#xff0c;日志系统是 “炼丹” 过程中复现实验、对比效果、排查问题的核心工具。结合实际工程经验&#xff0c;总结以下最佳实践和技巧&#xff0c;帮助提升实验效率&#xff1a; 一、日志工具的选择与配置 PL 通过统一的s…

基于JavaWeb的兼职发布平台的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.6系统展示系统首页用户登录招聘信…