【数据结构 02】队列

一、原理

队列通常是链表结构,只允许在一端进行数据插入,在另一端进行数据删除。

队列的特性是链式存储(随机增删)和先进先出(FIFO:First In First Out)。

队列的缺陷:

  1. 不支持随机访问
  2. 不支持随机增删
  3. 每个数据都需要维护一个指针,增大了空间资源消耗

二、Queue.h

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;

typedef struct Node
{
	DataType data;
	struct Node* next;
}Node;

typedef struct Queue
{
	Node* head;
	int size;
}Queue;

void Init(Queue* q)
{
	// 初始化创建一个空的头节点
	q->head = (Node*)malloc(sizeof(Node));
	q->head->next = NULL;
	q->size = 0;
}

int Empty(Queue* q)
{
	return q->size == 0;
}

void Push(Queue* q, DataType x)
{
	Node* node = (Node*)malloc(sizeof(Node));
	node->data = x;
	node->next = NULL;

	Node* cur = q->head;
	while (cur->next != NULL)
	{
		cur = cur->next;
	}

	cur->next = node;
	++q->size;
}

void Pop(Queue* q)
{
	if (Empty(q))
	{
		printf("队列为空,pop失败\n");
		return;
	}

	Node* cur = q->head->next;
	q->head->next = cur->next;
	
	free(cur);
	cur = NULL;
	--q->size;
}

DataType Front(Queue* q)
{
	if (Empty(q))
	{
		printf("队列为空,无队列首元素\n");
		return NULL;
	}

	return q->head->next->data;
}

void Destroy(Queue* q)
{
	while (!Empty(q))
	{
		Pop(q);
	}
	free(q->head);
	q->head = NULL;
	printf("队列销毁成功\n");
}

int Size(Queue* q)
{
	return q->size;
}

void Print(Queue* q)
{
	if (Empty(q))
	{
		printf("队列为空\n");
		return;
	}

	Node* cur = q->head->next;
	while (cur != NULL)
	{
		printf("%2d ", cur->data);
		cur = cur->next;
	}
	printf(",队列首元素:%2d,队列长度为:%d\n", Front(q), Size(q));
}

三、test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "Queue.h"

int main()
{
	Queue q;
	Init(&q);
	Push(&q, 1);
	Push(&q, 3);
	Push(&q, 5);
	Push(&q, 7);
	Push(&q, 2);
	Push(&q, 4);
	Push(&q, 6);
	Push(&q, 8);
	Print(&q);

	Pop(&q);
	Pop(&q);
	Pop(&q);
	Print(&q);

	Push(&q, 9);
	Print(&q);

	Pop(&q);
	Pop(&q);
	Pop(&q);
	Pop(&q);
	Pop(&q);
	Pop(&q);
	Pop(&q);
	Pop(&q);
	Pop(&q);
	Print(&q);

	Push(&q, 10);
	Push(&q, 20);
	Print(&q);
	Destroy(&q);
	Print(&q);
}

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

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

相关文章

[Python] 什么是集成算法,什么是随机森林?随机森林分类器(RandomForestClassifier)及其使用案例

什么是集成算法&#xff1f; 集成算法是一种机器学习方法&#xff0c;它将多个基本的学习算法&#xff08;也称为弱学习器&#xff09;组合在一起&#xff0c;形成一个更强大的预测模型。集成算法通过对基本模型的预测进行加权平均或多数投票等方式&#xff0c;来产生最终的预…

蓝桥OJ 3695聪明的小羊肖恩

思路&#xff1a;这道题利用二分和不等式的性质。1<i<j<n且L<a[i] a[j] < R > L - a[i] < a[j] < R - a[i]。遍历找出大于等于L - a[i] 和 大于 R - a[i] 的区间&#xff0c;区间长度即为当前i对应的下标对数。所有对数累加即为满足条件的下标对数量。…

elk之基础概念

写在前面 本文一起看下es的基础概念&#xff0c;比较枯燥的内容说&#xff0c;但不看又不行。开始。 1&#xff1a;document 文档&#xff0c;是es搜索存储数据的最小单元&#xff0c;相当于是MySQL的一行记录&#xff0c;但es中是一个json&#xff0c;如下是一个通过logsta…

ARDUINO 与ISP下载器使用相关注意事项

当用isp给arduno下载程序之后&#xff0c;板子上的bootloader将会丢失&#xff0c;所以要重新烧录bootloader&#xff0c;既然要烧录bootloader&#xff0c;那么什么是bootloader呢&#xff1f;正如你所想&#xff0c;bootloader当然是一个程序&#xff0c;既然要烧录到单片机中…

正则表达式补充以及sed

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…

【新书推荐】4.2节 字符编码规则

本节内容&#xff1a;字符编码规则。 ■字符编码规则&#xff1a;ASCII码、ANSI字符集、Unicode字符集。 ■变形国标码&#xff1a;国标码是16位编码&#xff0c;高8位表示汉字符的区号&#xff0c;低8位表示汉字符的位号。 4.2.1 字符编码规则 计算机只能存储二进制数0和1&a…

麒麟系统安装minio_centos8.0安装最新minio_离线安装minio并设置权限_创建桶---minio工作笔记001

https://www.minio.org.cn/?id=18&id=3&id=0&id=11&id=9&spinz=qianfeng&adinfo678=baidu&spinz=qianfeng&adinfo678=baidu%3E 首先去到官网去下载minio,然后 可以看到已经显示的官网,然后再去,右边点击下载 进入下载页面一般都是amd64的版本…

Django视图函数技巧,从入门到实战

文章目录 Django视图函数1.request对象的方法2.视图函数的常用的返回对象&#xff08;1&#xff09;response对象&#xff08;2&#xff09;JsonResponse对象&#xff08;3&#xff09;redirect() &#xff1a;给浏览器了一个30x的状态码 3.设置响应头和状态码&#xff08;1&am…

Linux---动静态库

前言 在初学Linux的时候&#xff0c;简单的提到过动静态库&#xff0c;但当时只是简单的讲述了一下什么是动态库&#xff0c;什么是静态库&#xff0c;我们可以在此基础上更进一步---制作库。在使用gcc编译器的时候&#xff0c;是默认使用动态链接的。 静态库 静态库&#x…

【数据结构 08】红黑树

一、概述 红黑树,是一种二叉搜索树,每一个节点上有一个存储位表示节点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长上两倍,因而是接进平衡的。 红黑树性质: 根节点是黑色红节点的两个孩子…

《Numpy 简易速速上手小册》第10章:Numpy案例研究和实践技巧(2024 最新版)

文章目录 10.1 实际案例分析10.1.1 基础知识10.1.2 完整案例&#xff1a;天气数据分析10.1.3 拓展案例 1&#xff1a;股票价格分析10.1.4 拓展案例 2&#xff1a;信号处理 10.2 Numpy 最佳实践10.2.1 基础知识10.2.2 完整案例&#xff1a;高效数组操作10.2.3 拓展案例 1&#x…

面试题 02.07. 链表相交(力扣LeetCode)

文章目录 面试题 02.07. 链表相交题目描述解题思路c代码优化后c代码 面试题 02.07. 链表相交 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 …

【轮式平衡机器人】——TMS320F28069片内外设之ADC

一、ADC概述 这一部分不是我们的重点&#xff0c;原理分类啥的这里简要说明&#xff01; 步骤&#xff1a;采样、保持、量化、编码 将采样电平&#xff08;模拟值&#xff09;转换为数字值的方法&#xff1a;直接比较型&#xff08;并行ADC、逐次逼近型ADC&#xff09;&…

通俗易懂理解注意力机制(Attention Mechanism)

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 大话注意力机制&#xff08;Attention Mechanism&#xff09; 注意力机制(Attention Mechanism) 深度学习中的注意力机制 注意力机制 二、注意力…

关于最小系统板PCB设计后的一些反思

简介 趁着刚刚画完板子寄回来&#xff0c;在这里做一些记录。 板子状况 这里打烊了5块PCB&#xff0c;但是没有进行SMT贴片&#xff0c;后续如果有芯片可以焊接上去进行后续验证。 封装问题 这里可以看到&#xff0c;我这里两侧的排针都是焊盘&#xff0c;不是通孔&#…

【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 1639. 通过给定词典构造目标字符串的方案数 给你一个字符串列表 words 和一个目标字符串 tar…

编译Opencv3.3.1遇到的编译器无法识别的警告的问题解除:

问题描述&#xff1a; 本文&#xff0c;就是在一个硬件的SDK中用到了opencv3.3.1的版本&#xff0c;在笔者目前的VS2019,CUDA11版本下编译的问题和解决。在做Cmake的configure的时候&#xff0c;Cmake报了一个找不到编译器版本的错误, Selecting windows SDK version 10.0.1904…

TOP100 矩阵

1.73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示&#xff1a; m matrix.lengthn matrix[0].length1 < m, n < 200-2^31 < matrix[i][j] < 2^31 - 1 思路&#xf…

EMQX 单机及集群搭建

目录 1. 通过 Yum 源安装&#xff08;CentOS7 单机安装&#xff09; 1.1. 通过以下命令配置 EMQX Yum 源&#xff1a; 1.2. 运行以下命令安装 EMQX&#xff1a; 1.3. 运行以下命令启动 EMQX&#xff1a; 1.4. 访问 http://192.168.88.130:18083&#xff0c;默认用户名: adm…

Java项目要不要部署在Docker里?

部署Java项目有很多种方式&#xff0c;传统的方式是直接在物理机或虚拟机上部署应用&#xff0c;但为什么现在容器化部署变得越来越流行&#xff0c; 个人觉得原因有以下几个&#xff1a; 1、 环境一致性&#xff1a;使用Docker可以确保开发、测试和生产环境的一致性&#xff…