【把玩数据结构】详解队列

news2024/11/19 9:22:48

目录

  • 队列介绍
    • 队列概念
    • 队列的结构
    • 生活中的队列
  • 队列的实现
    • 队列的初始化
    • 队列的销毁
    • 队尾入队列
    • 队头出队列
    • 获得队头元素
    • 获得队尾元素
    • 统计队列元素个数

队列介绍

队列概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列遵守先进先出FIFO(First In First Out)的原则。

入队列:队列的插入操作叫做入队列,进行插入操作的一端称为队尾。

出队列:队列的删除操作叫做出队列,进行删除操作的一端称为队头

队列的结构

在这里插入图片描述

生活中的队列

在生活中最常见的队列无非就是在食堂的窗口进行打饭了,总是先去排队的同学先离开队列。

队列的实现

队列的初始化

typedef int QDataType;		//方便以后修改存储的数据类型
typedef struct QueueNode		//队列中的节点
{
	QDataType val;
	struct QueueNode* next;
}QueueNode;

typedef struct Queue
{
	QueueNode* phead;
	QueueNode* ptail;
	int size;	//不要忘了保存数列的有效数据个数
}Queu

队列底层一般是用单链表来实现,然后队列本身有队头指针和队尾指针,还有有效数据个数size组成

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

队列的销毁

void QueueDestroy(Queue* pq)
{
	assert(pq);
	while (pq->phead != pq->ptail)
	{
		QueueNode* del = pq->phead;
		pq->phead = pq->phead->next;
		free(del);
		del = NULL;
	}
	free(pq->phead);
	pq->phead = NULL;
	pq->ptail = NULL;		//不要忘了把ptail也设置NULL,虽然他们是指向同一块空间,但是指针变量不是同一块空间
	pq->size = 0;//不要忘了把size设置0
}

这里要注意释放队尾指针,虽然最后都是指向和队头指向的同一块空间,但是指针变量的空间不一样

队尾入队列

这里入队列就要创建一个节点

QueueNode* QBuyNode(QDataType x)
{

	QueueNode* tmp = (QueueNode*)malloc(sizeof(QueueNode));
	if (tmp == NULL)
	{
		perror("malloc failed");
		exit(1);
	}
	tmp->val = x;
	tmp->next = NULL;
	return tmp;
}
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QueueNode* newnode = QBuyNode(x);
	//注意考虑队列为空的情况
	if (pq->phead == NULL)	//队列为空
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

注意队列为空的情况,队头和对尾是指向同一个节点

队头出队列

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QEmpty(pq));	//assert为假就会触发
	if (pq->phead == pq->ptail)	//如果队列只有一个数据,所有数据结构最好都考虑为空和只有一个数据的情况
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else
	{
		QueueNode* del = pq->phead;
		pq->phead = pq->phead->next;
		free(del);
		del = NULL;

	}
	//不要搞忘了--size
	pq->size--;
}

注意队列只有一个数据的情况和size–。

获得队头元素

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QEmpty(pq));	//assert为假会触发
	return pq->ptail->val;
}

获得队尾元素

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QEmpty(pq));//assert为假会触发
	return pq->ptail->val;
}

统计队列元素个数

int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

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

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

相关文章

Python 代码中的 yield 到底是什么鬼?

在Python编程中,有一个强大而神秘的关键字,那就是yield。初学者常常被它搞得晕头转向,而高级开发者则借助它实现高效的代码。到底yield是什么?它又是如何在Python代码中发挥作用的呢?让我们一起来揭开它的面纱。 Pyth…

Chrome浏览器设置暗黑模式 - 护眼模式 - 亮度调节 - DarkReader - 地址栏和书签栏设置为黑色背景

效果图 全黑 浅灰 (DarkReader设置开启亮色亮度-25) 全白 前言 主要分两部分需要操作, 1)地址栏和书签栏 》 需要修改浏览器的外观模式 2)页面主体 》 需要安装darkreader插件进行设置 步骤 1)地址栏和…

Unity UGUI 实战学习笔记(3)

仅作学习,不做任何商业用途 不是源码,不是源码! 是我通过"照虎画猫"写的,可能有些小修改 不提供素材,所以应该不算是盗版资源,侵权删 拼UI 提示面板的逻辑 using System.Collections; using System.Col…

加密溢出问题

今天编写程序,使用一个非常简单的对256取模的运算,但是总是得不到正确的结果。 后来发现,是数据的值的范围问题。 例如,处理图像时,值的范围是【0,255】. 异或等等运算都是没有问题的。 但是,如果进行加法…

websocket通信问题排查思路

websocket通信问题排查思路 一、websocket连接成功,但数据完全推不过来。 通过抓包发现,是回包时间太长超过了1分钟导致的。这种通常是推送数据的线程有问题导致的。 正常抓包的情况如下: 二、大量数据可以正常推送成功,不定时…

C++从入门到起飞之——内存管理(万字详解) 全方位剖析!

🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1. C/C内存分布 2. C语言中动态内存管理方式:malloc/calloc/realloc/free 3. C内存管理…

AI大模型大厂面试真题:「2024大厂大模型技术岗内部面试题+答案」

AI大模型岗的大厂门槛又降低了!实在太缺人了,大模型岗位真的强烈建议各位多投提前批,▶️众所周知,2025届秋招提前批已经打响,🙋在这里真心建议大家6月7月一定要多投提前批! 💻我们…

数字音频工作站(DAW)软件FL Studio 24.1.1.4234中文版

在数字化音乐制作的浪潮中,FL Studio 24.1.1.4234的发布无疑又掀起了一股新的热潮。这款由Image-Line公司开发的数字音频工作站(DAW)软件,以其强大的功能和易用的界面,赢得了全球无数音乐制作人的青睐。本文将深入探讨…

git cherry-pick用法

git cherry-pick 如何将我另一个分支上的某个提交合并到新的分支上 首先切换到新分支上git cherry-pick <commit_hash>例如&#xff1a;git cherry-pick f8a70c9

Linux--Socket编程TCP

前文&#xff1a;Socket套接字编程 TCP的特点 面向连接&#xff1a;TCP 在发送数据之前&#xff0c;必须先建立连接。可靠性&#xff1a;TCP 提供了数据传输的可靠性。面向字节流&#xff1a;TCP 是一个面向字节流的协议&#xff0c;这意味着 TCP 将应用程序交下来的数据看成是…

简单的数据结构:栈

1.栈的基本概念 1.1栈的定义 栈是一种线性表&#xff0c;只能在一端进行数据的插入或删除&#xff0c;可以用数组或链表来实现&#xff0c;这里以数组为例进行说明 栈顶 &#xff1a;数据出入的那一端&#xff0c;通常用Top表示 栈底 :相对于栈顶的另一端&#xff0c;也是固…

【无标题】shell脚本的基本命令+编写shell脚本

shell脚本 一.shell基础 1.shell概念 2.shell脚本 3.shell脚本编写注意事项 二.编写shell脚本 1.编写一个helloworld脚本&#xff0c;运行脚本 [rootshell ~]# vim helloworld.sh #!/bin/bash //声明 echo "hello world!" ls -lh /etc/ 运行脚本(四种方式)&…

react版本判断是否面包含

react-admin: react版本 import { useState,useEffect } from react import ./Secene.css import { Checkbox } from "antd"; import* as turf from turf/turf; import type { CheckboxProps } from antd; // const onChange: CheckboxProps[onChange] (e) >…

bugku-web-cookies

进来以后看到一个巨长的字符串, 源码同样,发现url后面是base64编码解码得keys.txt 还有一个line参数&#xff0c;修改并没有发生任何变化。我想不到要改keys.txt成index.php&#xff08;base64加密格式&#xff1a;aW5kZXgucGhw&#xff09; line1时&#xff1a; line2时&…

Linux系统编程(2):信号

Linux内核提供了各种各样的内核对象用于协调进程间的通讯&#xff0c;如信号、管道、消息队列等&#xff0c; 本章针对Linux内核的信号对象进行讲解。 1. 信号的基本概念 1.1. 概述 信号&#xff08;signal&#xff09;&#xff0c;又称为软中断信号&#xff0c;用于通知进程…

Go语言垃圾回收GC(完整)

垃圾回收的概念 GC(垃圾回收)是 Go 语言中的一个重要机制&#xff0c;用于自动管理内存 在 Go 语言中&#xff0c;GC 会自动发现和回收那些不再被使用的内存空间&#xff0c;从而防止内存泄漏和有 效利用内存。 内存垃圾怎样产生 程序在内存上被分为堆区、栈区、全局数据区、…

黑马头条vue2.0项目实战(一)——项目初始化

1. 图标素材&#xff08;iconfont简介&#xff09; 制作字体图标的工具有很多&#xff0c;推荐使用&#xff1a;iconfont-阿里巴巴矢量图标库。 注册账户 创建项目 可以根据项目自定义 class 前缀 上传图标到项目 生成链接&#xff0c;复制 css 代码&#xff0c;在项目中使用…

数组与链表谁访问更快

一、线性表 线性表是数据结构中的一种基本类型&#xff0c;它由一组线性排列的元素组成。线性表的特点是可以进行顺序访问&#xff0c;但不支持随机访问。 二、非线性表 非线性表是数据结构中另一种类型&#xff0c;如树和图&#xff0c;它们由多个节点组成&#xff0c;节点…