数据结构队列实现(赋完整代码)

news2024/9/26 5:21:45

文章目录

  • 1、定义及结构
  • 2、队列实现
  • 完整代码


1、定义及结构

1.一种特殊的线性表,只允许在一段进行插入,另一段进行删除;

2.进行插入操作的一端称为队尾,进行删除操作的一端称为队头;

3.队列具有先进先出的特性 FIFO(First In First Out)

在这里插入图片描述

队列总体来说是现实生活中的排队取号类似,先取票的,就先办理业务;队列中,先进入的,就先出去

2、队列实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列类似顺序表头删数据,效率会比较低;此处我们就以链表结构实现队列举例:

1)结构定义:队列中我们在对头位置处队,对尾位置入队。为了便于操作,我们新建的一个结构体,用于存放队头、对尾位置的地址以及队中的数据个数。

typedef struct QueueNode {
	QNDataType val;//数据域
	struct QueueNode* next;//指针域
}QN;

typedef struct Queue {
	QN* head;//头
	QN* tail;//尾
	int size;//有效数据个数,便于统计个数
}Queue;

2)初始化

// 初始化队列 
void QueueInit(Queue* q) {
	assert(q);
	//初始队中无元素,队头、队尾都置为NULL
	q->head = q->tail = NULL;
	q->size = 0;
}

3)入队

// 入队
void QueuePush(Queue* q, QNDataType data) {
	assert(q);

	//创建新节点
	QN* newNode = (QN*)malloc(sizeof(QN));
	newNode->next = NULL;
	newNode->val = data;
	if (newNode == NULL) {
		perror("malloc");
	}

	//第一个节点,要对头位置进行修改
	if (q->head == NULL) {
		q->head = q->tail = newNode;
	}
	//其余位置都支对尾位置进行修改即可
	else {
		q->tail->next = newNode;
		q->tail = newNode;
	}

	//有效数据个数加一
	q->size++;
}

4)出队

//出队
void QueuePop(Queue* q) {
	assert(q);

	//判空
	assert(q->head);

	//仅有一个节点
	if (q->head->next == NULL) {
		free(q->head);
		q->head = NULL;
	}
	//有两个或以上节点
	else {
		QN* next = q->head->next;
		free(q->head);
		q->head = NULL;

		q->head = next;
	}

	q->size--;
}

5)获取队头元素

// 获取队列头部元素 
QNDataType QueueFront(Queue* q) {
	assert(q);
	assert(q->head);

	return q->head->val;
}

6)获取队尾元素

// 获取队列队尾元素 
QNDataType QueueBack(Queue* q) {
	assert(q);
	assert(q->head);

	return q->tail->val;
}

7)获取队列中元素个数

// 获取队列中有效元素个数 
int QueueSize(Queue* q) {
	assert(q);

	return q->size;
}

8)队列判空

// 检测队列是否为空
bool QueueEmpty(Queue* q) {
	assert(q);

	return q->head == NULL;
}

9)清空队列

//清空队列
void QueueClear(Queue* q) {
	assert(q);
	assert(q->head);
	//将队列中除首元素节点外的节点释放
	QN* t = q->head->next;
	while (t) {
		QN* next = t->next;
		free(t);
		t = NULL;

		t = next;
	}

	//将头和尾节点置为NULL
	q->head = q->tail = NULL;
}

10)销毁队列

// 销毁队列 
void QueueDestroy(Queue* q) {
	assert(q);

	//将队列中所有空间释放
	while (q->head) {
		QN* next = q->head->next;
		free(q->head);
		q->head = NULL;

		q->head = next;
	}
	q->size = 0;
}

完整代码

1.Queue.h

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

typedef int QNDataType;

typedef struct QueueNode {
	QNDataType val;//数据域
	struct QueueNode* next;//指针域
}QN;

typedef struct Queue {
	QN* head;//头
	QN* tail;//尾
	int size;//有效数据个数,便于统计个数
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QNDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QNDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QNDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空
bool QueueEmpty(Queue* q);
//清空
void QueueClear(Queue*q);
// 销毁队列 
void QueueDestroy(Queue* q);

2.Queue.c

#pragma once
#include"Queue.h"

// 初始化队列 
void QueueInit(Queue* q) {
	assert(q);
	//初始队中无元素,队头、队尾都置为NULL
	q->head = q->tail = NULL;
	q->size = 0;
}

// 入队
void QueuePush(Queue* q, QNDataType data) {
	assert(q);

	//创建新节点
	QN* newNode = (QN*)malloc(sizeof(QN));
	newNode->next = NULL;
	newNode->val = data;
	if (newNode == NULL) {
		perror("malloc");
	}

	//第一个节点,要对头位置进行修改
	if (q->head == NULL) {
		q->head = q->tail = newNode;
	}
	//其余位置都支对尾位置进行修改即可
	else {
		q->tail->next = newNode;
		q->tail = newNode;
	}

	//有效数据个数加一
	q->size++;
}

//出队
void QueuePop(Queue* q) {
	assert(q);

	//判空
	assert(q->head);

	//仅有一个节点
	if (q->head->next == NULL) {
		free(q->head);
		q->head = NULL;
	}
	//有两个或以上节点
	else {
		QN* next = q->head->next;
		free(q->head);
		q->head = NULL;

		q->head = next;
	}

	q->size--;
}

// 获取队列头部元素 
QNDataType QueueFront(Queue* q) {
	assert(q);
	assert(q->head);

	return q->head->val;
}

// 获取队列队尾元素 
QNDataType QueueBack(Queue* q) {
	assert(q);
	assert(q->head);

	return q->tail->val;
}

// 获取队列中有效元素个数 
int QueueSize(Queue* q) {
	assert(q);

	return q->size;
}

// 检测队列是否为空
bool QueueEmpty(Queue* q) {
	assert(q);

	return q->head == NULL;
}

//清空队列
void QueueClear(Queue* q) {
	assert(q);
	assert(q->head);
	//将队列中除首元素节点外的节点释放
	QN* t = q->head->next;
	while (t) {
		QN* next = t->next;
		free(t);
		t = NULL;

		t = next;
	}

	//将头和尾节点置为NULL
	q->head = q->tail = NULL;
}

// 销毁队列 
void QueueDestroy(Queue* q) {
	assert(q);

	//将队列中所有空间释放
	while (q->head) {
		QN* next = q->head->next;
		free(q->head);
		q->head = NULL;

		q->head = next;
	}
	q->size = 0;
}

3.Test.c

#define _CRT_SECURE_NO_WARNINGS
#include"Queue.h"

int main() {

	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 4);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePop(&q);
	int head = QueueFront(&q);
	printf("%d\n",head);
	int end = QueueBack(&q);
	printf("%d\n",end);
	int size = QueueSize(&q);
	printf("%d\n",size);
	bool ret1 = QueueEmpty(&q);
	if (ret1 == true) {
		printf("空\n");
	}
	else {
		printf("非空\n");
	}
	QueueClear(&q);

	bool ret2 = QueueEmpty(&q);
	if (ret2 == true) {
		printf("空\n");
	}
	else {
		printf("非空\n");
	}

	QueueDestroy(&q);

	return 0;
}

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

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

相关文章

Linux操作系统——重定向与缓冲区

1.理解一下struct file内核对象 上一篇文章&#xff08;文件详解&#xff09;我们一直在谈&#xff0c;一个文件要被访问就必须要先被打开&#xff0c;打开之前就必须要先把文件加载到内存&#xff0c;同时呢我们的操作系统为了管理文件也会为我们的文件创建相对应的struct fi…

C语言从入门到实战——结构体与位段

结构体与位段 前言一、结构体类型的声明1.1 结构体1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 二、 结构体内存对齐2.1 对齐规则2.2 为什么存在内存对齐2.3 修改默认对齐数 三、结构体传参四、 结构体实现位段4.1 什么是位段4.2 位段…

视频剪辑实例:探索画中画视频剪辑,创意无限可能,批量制作视频

随着社交媒体和视频平台的迅速发展&#xff0c;视频剪辑&#xff0c;作为视频创作的核心环节&#xff0c;对于呈现内容、传达情感和提升体验具有至关重要的作用。现在来看云炫AI智剪的视频剪辑实例&#xff0c;如何批量制作视频&#xff0c;提升工作效率。 画中画视频合并成功…

国产麒麟系统开机没有网络需要点一下这个设置

问题描述&#xff1a; 一台国产电脑网线连接正常&#xff0c;打开网页后显示无法访问&#xff0c;那么是什么原因无法上网呢&#xff1f;下面就告诉你一个小方法去解决一下这个问题&#xff1b; 检查故障&#xff1a; 检测交换机、网线、水晶头全都正常&#xff0c;同房间摆放的…

荣耀开发者大会 2023·一张图读懂服务分发分论坛

荣耀智慧服务&#xff0c;高效连接开发者与用户&#xff0c;构建主动服务全新体验&#xff01; 2023年荣耀智慧服务总数已突破25000&#xff0c;帮助众多开发者提升业务增长~ 今年将会开放更多生态场景&#xff0c;配合多元服务分发&#xff0c;从应用到场景&#xff0c;从用…

闪存的基础知识1-Vt的定义

系列文章目录 本次系列文章主要分享与存储相关的知识 文章目录 目录 系列文章目录 前言 一、mos管 阈值电压是什么&#xff1f; 二、详细分析 1.通俗理解 2.读入数据 总结 前言 阈值电压(Vt) 阈值电压(Vt或Vth)的概念是从MOS管来的。 一、mos管 阈值电压是什么&#xff1f; …

element+vue 之图片放大器

1.安装插件 npm install vue-photo-zoom-pro2.main.js导入 // 放大镜 import VuePhotoZoomPro from vue-photo-zoom-pro Vue.use(VuePhotoZoomPro)3.页面使用 <vue-photo-zoom-pro:url"imgUrl":out-zoomer"true":scale"2"style"width:…

AI模型理解误区:微调垂直行业-VS-企业专属知识库或AI助理

概述 企业定制私有化大模型的区别&#xff0c;分为训练大模型和调用大模型两种方向&#xff0c;以及企业自己的智能客服的实现方法。 - 企业定制的私有化大模型与一般的大模型不同&#xff0c;需要高成本训练。- 企业可以选择调用已经训练好的大模型来应用。- 企业可以使用向量…

为什么建筑工程行业要十分重视主数据管理?

业务背景 主数据管理是数字化技术不可或缺的一部分。 建筑行业数字化转型中&#xff0c;跨部门协作是非常重要的。主数据管理能够提供一个统一的数据平台&#xff0c;方便各个部门数据共享和交流&#xff0c;也可以实现人力、物资、设备等各种资源的集中管理和优化配置。 此外…

[element-ui] 级联选择器el-cascader不触发change事件

el-cascader 使用官网的数据是可以的 官网数据中最后一级没有children // 删除最后一级的children changeKey(arr) {for (var i0; i<arr.length; i) {if (arr[i].children.length) {this.changeKey(arr[i].children)} else {delete arr[i].children}} ]就可以了 参考&…

浅谈专项测试之弱网络测试

一&#xff0e;弱网络测试背景 移动端产品的使用并非完全都是在流畅的wifi环境&#xff0c;大部分用户主要使用4G,3G,2G等网络&#xff0c;另外因为移动端产品使用的场景多变&#xff0c;如进公交&#xff0c;上地铁&#xff0c;坐电梯&#xff0c;使得弱网测试显得尤为重要。考…

基于springboot数码论坛系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把数码论坛与现在网络相结合&#xff0c;利用java技术建设数码论坛系统&#xff0c;实现数码论坛的信息化。则对于进一步提高数码论坛发展&#xff0c;丰富数码论坛经验能起到不少的促进作用。 数码论坛系统能够通过互联网得到广泛…

大语言模型系列-总述

大语言模型发展史 研究人员发现&#xff0c;扩展预训练模型&#xff08;Pre-training Language Model&#xff0c;PLM&#xff09;&#xff0c;例如扩展模型大小或数据大小&#xff0c;通常会提高下游任务的模型性能&#xff0c;模型大小从几十亿&#xff08;1 B 10亿&#x…

细说JavaScript对象(JavaScript对象详解)

在JavaScript中对象作为数据类型之一&#xff0c;它的数据结构区别于其余5中数据类型&#xff0c;从数据结构角度看对象就是数据值的几个&#xff0c;其书就结构就是若干组名值对&#xff0c;类似于其他语言中的哈希、散列 关联数组等&#xff0c;但对象在JavaScript中不仅仅扮…

【MySQL高级】——InnoDB数据存储结构

1. 数据库的存储结构&#xff1a;页 <1> 磁盘与内存交互的基本单位&#xff1a;页 <2> 页结构概述 <3> 页的大小 <4> 页的上层结构 2. 页的内部结构 <1> 页的分类 <2> 页的结构 <3> File Header&#xff08;文件头&#xff09; 1.…

AUTO SEG-LOSS SEARCHING METRIC SURROGATES FOR SEMANTIC SEGMENTATION

AUTO SEG-LOSS: 搜索度量替代语义分割 论文链接&#xff1a;https://arxiv.org/abs/2010.07930 项目链接&#xff1a;https://github.com/fundamentalvision/Auto-Seg-Loss ABSTRACT 设计合适的损失函数是训练深度网络的关键。特别是在语义分割领域&#xff0c;针对不同的场…

Nginx安装http2和ssl模块

Nginx安装http2和ssl模块 Nginx在执行默认安装命令的时候&#xff0c;并不会编译启用ngx_http_v2_module模块。故在修改Nginx配置文件启用http2.0协议的时候会报错。 一.检查Nginx安装了哪些模块 #进入Nginx的安装目录 cd /usr/local/nginx #执行命令查看安装了哪些模块 ./sbi…

腾讯云服务器定价_云服务器价格_云服务器计费模式

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

java基本类型与包装类型之间的关系

JAVA基本类型和包装类型 前言 Java语言中的数据类型分为基本数据类型和引用类型&#xff0c;而我们进行Java开发的时候都听说过基本数据类型和包装类型&#xff0c;今天我们就来详细聊一聊Java中的基本数据类型和包装类型之间的区别。 基本数据类型 Java中的基本数据类型一共有…

2024腾讯云服务器购买指南一步步全流程攻略(超详细)

腾讯云服务器购买流程很简单&#xff0c;有两种购买方式&#xff0c;直接在官方活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动…