【C语言】实现队列

目录
(一)队列
(二)头文件
(三) 功能实现
(1)初始化
(2) 销毁队列
(3) 入队
(4)出队
(5)得到队头的数据
(6)得到队尾的数据
(7)判断队列是否为空
(8)得到队列内数据个数
正文开始:
(一)队列
队列是一种数据结构,其中元素按照先进先出(FIFO)的顺序进行操作。在队列中,新元素被插入到队列的尾部,而删除元素发生在队列的头部。
队列可以用于处理任务或事件的顺序,例如处理请求、消息传递等。可以将任务或事件放入队列的尾部,并按照它们被放入队列的顺序进行处理。
队列的常见操作包括入队(向队列尾部添加元素)、出队(从队列头部删除元素)、获取队列头部的元素(但不删除)、判断队列是否为空等。
队列可以用数组或链表实现。使用数组实现的队列称为顺序队列,使用链表实现的队列称为链式队列。顺序队列的插入和删除操作会涉及元素的移动,而链式队列不需要移动元素,因此插入和删除操作的时间复杂度都是O(1)。
(二)头文件
队列可以使用链表实现,也可以使用顺序表实现,但是队列需要频繁的头删,顺序表的头删效率低,由于队列规定了队头出,队尾进,所以顺序表的随机访问功能在队列中用不到;而链表的头删与尾插效率高,适合实现队列,因此本文用链表实现队列。
什么是SLT?
SLT库
STL(Standard Template Library)是C++的标准库,提供了一组通用数据结构和算法的模板,可以方便地用于各种应用程序的开发。
STL包含了多个模块,其中最重要的被称为容器(Containers)、算法(Algorithms)和迭代器(Iterators)。
容器模块包括了多种数据结构,如向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。这些容器提供了不同的数据组织方式和操作,可以根据需要选择合适的容器进行数据存储和访问。
算法模块包含了多种常用算法,如排序、查找、合并、遍历等。这些算法可以用于各种数据结构上,无需重复实现,只需直接调用相应的算法函数即可。
迭代器模块提供了一种通用的访问容器元素的方式,通过迭代器可以遍历容器中的元素,并进行读取、修改等操作。迭代器相当于一个指针,可以指向容器中的某个位置,通过迭代器可以直接访问容器中的元素。
本文根据Cpp的STL库来实现队列(Queue)的相关功能:包括队列初始化,销毁,向队列中插入数据(入队),删除数据(出队),得到队列的头数据(front),得到队列的尾数据(tail),判断队列是否为空,得到队列内数据个数等共八项功能接口。
这里不加解释的给出头文件,根据头文件来实现队列的具体功能:
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>/* 基于链表实现队列,入数据的为队尾,出数据的为队头* 顺序表实现队列头删效率低* 顺序表的随机访问队列中用不到* 所以选择用链表实现队列
*/
//队列存储数据类型
typedef int QueueDatatype;//队列的一个节点
typedef struct QueueNode
{QueueDatatype data;struct QueueNode* next;
}QNode;//一个队列
typedef struct Queue
{QNode* phead;//指向队列头的指针QNode* ptail;//指向队列尾的指针int size; //队列内数据个数
}Queue;//初始化队列
void Qinit(Queue* pq);//销毁队列
void QDestroy(Queue* pq);//向队列插入数据
void Qpush(Queue* pq,QueueDatatype x);//删除队列的数据
void Qpop(Queue* pq);//得到front数据
QueueDatatype Qfront(Queue* pq);//得到tail数据
QueueDatatype Qback(Queue* pq);//判断队列是否为空
bool Qempty(Queue* pq);//得到队列内数据个数
int Qsize(Queue* pq);
(三) 功能实现
(1)初始化
队列初始化
首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;
将队列的头尾指针都置空,表示此时队列内没有任何数据,数据个数(size)置0;
//初始化队列 void Qinit(Queue* pq) {assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0; }
(2) 销毁队列
销毁队列
首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;
创建pcur指针,遍历链表;
创建next指针,保存下一个节点,防止释放此节点后,无法解引用找到下一个节点;
最后,分别指向队头与队尾的phead与ptail指针要置空;
//销毁队列 void QDestroy(Queue* pq) {assert(pq);QNode* pcur = pq->phead;while (pcur){QNode* next = pcur->next;free(pcur);pcur = next;}pq->ptail = pq->phead = NULL; }
(3) 入队
入队
首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;
入队时,队列有两种状态:
若队列为空(此时队头队尾都为空),让头指针和尾指针都指向新节点newnode;
若队列不为空,执行尾插;
不要忘记让队列的size++;
//向队列插入数据 void Qpush(Queue* pq, QueueDatatype x) {assert(pq);//获取新节点QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!");return;}newnode->data = x;newnode->next = NULL;//队列为空,此时队头队尾都为空if (pq->phead == NULL){assert(pq->ptail == NULL);//防止一个为NULL一个不为NULL的情况pq->phead = pq->ptail = newnode;}else//队列不为空,尾插{pq->ptail->next = newnode;pq->ptail = newnode;}//队列节点数加一pq->size++; }
(4)出队
出队
首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;
判断队列不为空,通过assert断言实现;
执行头删,创建next指针保存phead的next节点,freephead后,通过next找到新的头节点;
不要忘记队列的size--;
//删除队头的数据 void Qpop(Queue* pq) {assert(pq);assert(!Qempty(pq));QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;pq->size--; }
(5)得到队头的数据
首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;
直接返回即可;
//得到front数据 QueueDatatype Qfront(Queue* pq) {assert(pq);return pq->phead->data; }
(6)得到队尾的数据
首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;
直接返回即可;
//得到tail数据 QueueDatatype Qback(Queue* pq) {assert(pq);return pq->ptail->data; }
(7)判断队列是否为空
返回判断表达式的结果;(若队列为空,返回真(1),否则返回假(0))
/判断队列是否为空 bool Qempty(Queue* pq) {//队列为空,返回真;非空,返回假return pq->size == 0; }
(8)得到队列内数据个数
直接返回队列的size即可;
//得到队列内数据个数 int Qsize(Queue* pq) {return pq->size; }
完 ~
未经作者同意禁止转载
相关文章:
【C语言】实现队列
目录 (一)队列 (二)头文件 (三) 功能实现 (1)初始化 (2) 销毁队列 (3) 入队 (4)出队 (5&a…...
【友塔笔试面试复盘】八边形取反问题
问题:一个八边形每条边都是0,现在有取反操作,选择一条边取反会同时把当前边和2个邻边取反(如果是0变为1,如果是1变为0) 现在问你怎么取反能使得八条边都变为1. 当时陷入了暴力递归漩涡,给出一个…...
GB 18585-2023 壁纸中有害物质限量
壁纸/墙布因其色彩多样,图案丰富,施工方便,价格便宜等多种优势,广泛应用于室内装修材料,在国内,日本,欧美等地区非常普及。 GB 18585-2023壁纸中有害物质限量测试项目: 测试项目 测…...
全面的ASP.NET Core Blazor简介和快速入门
前言 因为咱们的MongoDB入门到实战教程Web端准备使用Blazor来作为前端展示UI,本篇文章主要是介绍Blazor是一个怎样的Web UI框架,其优势和特点在哪?并带你快速入门上手ASP.NET Core Blazor(当然这个前提是你要有一定的C#编程基础的情况&#x…...
HGAME 2024 WEEK2 Crypto WP
前言 我很菜,有没做出来的题目,带*号题为复现。 midRSA 题目: from Crypto.Util.number import * from secret import flagdef padding(flag):return flagb\xff*(64-len(flag))flagpadding(flag) mbytes_to_long(flag) pgetPrime(512) qg…...
Postman轻松签名,让SHA256withRSA保驾护航!
前言 在接口测试中,我们经常需要对请求进行签名,以保证数据的安全性。而SHA256withRSA是一种较为常见的签名算法,它可以使用私钥对数据进行签名,使用公钥进行验签。 但是,实现该算法签名可能会涉及到一些繁琐的操作&…...
C#面:简述装箱和拆箱
在C#中,装箱(boxing)和拆箱(unboxing)是用于在值类型和引用类型之间进行转换的过程。 装箱:(Boxing) 是将值类型转换为引用类型的过程。 将一个值类型赋值给一个对象类型时&#x…...
【Kubernetes in Action笔记】1.快速开始
在Kubernetes上运行一个程序 基础运行环境 当前的运行环境为使用虚拟机构建的单master集群。 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 109d v1.27.1 k8s-node1 Ready …...
踩坑实录(Fourth Day)
今天开工了,其实还沉浸在过年放假的喜悦中……今天在自己写 Vue3 的项目,虽说是跟着 B 站在敲,但是依旧是踩了一些个坑,就离谱……照着敲都能踩到坑,我也是醉了…… 此为第四篇(2024 年 02 月 18 日&#x…...
【python】网络爬虫与信息提取--requests库
导学 当一个软件想获得数据,那么我们只有把网站当成api就可以 requests库:自动爬取HTML页面,自动网络请求提交 robots协议:网络爬虫排除标准(网络爬虫的规则) beautiful soup库:解析HTML页面 工具&…...
洛谷 P8627 [蓝桥杯 2015 省 A] 饮料换购
参考代码and代码解读 #include <bits/stdc.h> using namespace std; int main() { int n; scanf("%d", &n); int dr;//drdrink; dr n;//把drink赋值于n; while (n > 2) {//剩余的总瓶盖数要大于二,才能换得下一瓶饮料; dr n…...
Academic Inquiry|投稿状态分享(ACS,Wiley,RSC,Elsevier,MDPI,Springer Nature出版社)
作为科研人员,我们经常会面临着向学术期刊投稿的问题。一般来说,期刊的投稿状态会在官方网站上进行公示,我们可以通过期刊的官方网站或者投稿系统查询到我们投稿的论文的状态,对于不同的期刊在投稿系统中会有不同的显示。 说明&am…...
1+X运维试题样卷C卷(初级)
云计算C卷 单选题(200分) 1.在OSI模型中,HTTP协议工作在第()层,交换机工作在第()层。(10分) (答案未做:0分) A、7/3 B、7/2 (正确答案) C、6/3 D、6/2 2.Linux有三个查看文件的命令,若希望在查看文件内容过程中可以用光标上下移动来查看文件内容,应使用命令。(10分…...
Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)
一、控制反转:缩写IoC 是一种设计原则,降低程序代码之间的耦合度 对象由Ioc容器统一管理,当程序需要使用对象时直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器 二、依赖注入:缩写DI 依赖注入是一种消除类之…...
MySQL 基础知识(四)之表操作
目录 1 约束 2 查看已有表 3 创建表 4 查看表结构 5 修改表 6 删除表 1 约束 主键约束 primary key:唯一,标识表中的一行数据,此列的值不可重复,且不能为 NULL,此外,可以多个列组成主键唯一约束 uniq…...
计算机网络——10FTP
FTP FTP:文件传输协议 向远程主机上传输文件或从远程主机接收文件客户/服务器模式 客户端:发起传输的一方服务器:远程主机 ftp:RFC 959ftp服务器:端口号为21 FTP:控制连接与数据连接分开 控制连接 FTP客户端与FTP服…...
javascript中的this指向
文章目录 探索 JavaScript 中的神奇之谜:this关键字解析this 是什么?为何 this如此重要?this 的工作原理实例解析默认绑定隐式绑定显式绑定new 绑定 探索 JavaScript 中的神奇之谜:this关键字解析 JavaScript,作为一门…...
WebServer 之 http连接处理(下)
目录 ✊请求报文--解析 流程图 && 状态机 状态机 -- 状态转移图 主状态机 从状态机 http 报文解析 HTTP_CODE 含义 从状态机 逻辑 主状态机 逻辑 🐞请求报文--响应 基础API stat mmap iovec writev 流程图 HTTP_CODE 含义(2) 代码分析 …...
Android电量相关知识
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、 查看耗电情况3.1 注册广播 ACTION…...
【Java多线程】线程中几个常见的属性以及状态
目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识,由系统自动分配,不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
