数据结构队列

news2024/11/28 18:20:34

数据结构队列

  • 队列的概念及结构
  • 队列的是实现
    • 数据结构
    • 函数接口
    • 初始化
    • 销毁
    • 入队列(尾插)
    • 出队列(头删)
    • 求队列的长度
    • 判断队列是否为空
    • 取队头的数据
    • 取队尾的数据

队列的概念及结构

队列之允许在一段及进行数据插入操作,在另一端进行数据的删除操作的特殊线性表。队列具有先进先出(First In First Out)的特性
进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
在这里插入图片描述

队列的是实现

队列用数组和链表都可以实现,使用链表的结构实现更优一点,因为如果使用数组的结构,出队列在数组头上出数据,效率比较低。

数据结构

我们选择用链表实现,首先创建一个节点结构体QueueNode,在创建一个结构体来存队列的头节点指针和尾节点指针,这样入队和出队的效率会大大提高。
定义一个整型变量Size来存放队列的长度
代码:

typedef int QDataType;//数据类型

typedef struct QueueNode
{
	struct Queue* next;//下一个节点
	QDataType data;//数据
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;

函数接口

void QueueInit(Queue* pq);//初始化
void QueueDestroy(Queue* pq);//销毁
void QueuePush(Queue*pq,QDataType x);//插入
void QueuePop(Queue* pq);//删除
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);//判断队列是否为空
QDataType QueueFront(Queue* pq); 
QDataType QueueBack(Queue* pq);

初始化

空队列的头和尾节点都是NULL,比较简单
代码:

void QueueInit(Queue* pq)//初始化
{
	assert(pq);
	
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

销毁

直接逐步遍历链表然后逐步free
代码:

void QueueDestroy(Queue* pq)//销毁
{
	assert(pq);

	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;//防止野指针的生成
	pq->size = 0;
}

入队列(尾插)

在这里插入图片描述
队列的性质是先进先出,所以入队就是尾插,那么就简单了
1.只要是插入就要判断队列是否为空,若为空就需要改变头指针,让头指针指向新节点。
2.不为空直接将尾指针指向的节点连接新节点即可。
代码:

void QueuePush(Queue* pq,QDataType x)//插入(尾插)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc\n");
		return;
	}

	newnode->data = x;//数据的写入
	newnode->next = NULL;//因为是尾插 所以尾指针为NULL

	if (pq->head == NULL)//如果插入前队列为空
	{
		assert(pq->tail == NULL);//如果head为空 tail不为空就有问题
		pq->head = pq->tail = newnode;
	}
	else //插入前队列不为空
	{
		pq->tail->next = newnode;
		pq->tail = pq->tail->next;//尾节点向后遍历
	}
		pq->size++;
}

出队列(头删)

在这里插入图片描述
出队列就相当于链表的头删,
1.头删要排除空队列的情况。
2.需要创建临时变量
3.当队列有一个元素的时候,删除后head为NULL但是tail为野指针,所以tail也需要置空。
代码:

void QueuePop(Queue* pq)//删除(头删)
{
	
	assert(pq);
	assert(pq->head);//空队列不能删除

	QNode* cur = pq->head;
	pq->head = pq->head->next;
	free(cur);
	cur = NULL;
	pq->size--;
	if (pq->head  == NULL)//队列中只有一个元素删除了之后 head为NULL,但是此时tail为野指针
	{
		pq->tail = NULL;
	}
}

求队列的长度

int QueueSize(Queue* pq)//求队列的长度
{
	assert(pq);

	return pq->size;
}

判断队列是否为空

bool QueueEmpty(Queue* pq)//判断队列是否为空
{
	assert(pq);

	return pq->size == 0;
}

取队头的数据

QDataType QueueFront(Queue* pq)//取队头的数据
{
	assert(pq);
	assert(!QueueEmpty(pq));//队列不为空

	return pq->head->data;
}

取队尾的数据

QDataType QueueBack(Queue* pq) //取队尾的数据
{

	assert(pq);
	assert(!QueueEmpty(pq));//队列不为空

	return pq->tail->data;
}

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

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

相关文章

LeetCode 356. Line Reflection【数学,哈希表】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

IO day1

1->x.mind 2-> 3->计算一个文件的大小,计算一个文件有几行。封装成函数

MyBatisPlus查询条件设置、映射匹配兼容性、id生成策略、多数据操作

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 MyBatisPlus 一、 查询条件设置二、 映射匹配兼容…

数据结构day7栈-链式栈原理及实现

全部代码&#xff1a; main.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "linkstack.h"int main(int argc, char *argv[]) {linkstack s;s stack_create();if(s NULL){return -1;}stack_push(s, 10);stack_push(s…

[图文并茂]C++线性表及其逻辑结构

1.1线性表的定义 线性表是具有相同特性的数据元素的一个有限序列 对应的逻辑结构图形&#xff1a; 从线性表的定义中可以看出它的特性&#xff1a; &#xff08;1&#xff09;有穷性&#xff1a;一个线性表中的元素个数是有限的 &#xff08;2&#xff09;一致性&#xff1a…

注册登录首选,趣味滑块验证码

前言 注册登录账户时&#xff0c;保障账户安全是首要任务&#xff01;使用趣味滑块验证码&#xff0c;既能有效防御恶意攻击&#xff0c;又能为验证过程增添一丝乐趣。让注册和登录变得更加有趣又安全&#xff01; HTML代码 <script src"https://cdn6.kgcaptcha.co…

Ubutnu python2与python3切换

python -V #查看默认版本 Python 2.7.17 python3 -V #查看电脑3的版本 Python 3.6.9 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 #设置两个版本的…

【Linux】虚拟地址空间理解

虚拟地址空间 虚拟地址是操作系统管理内存的一种方式。**方便不同进程使用的虚拟地址彼此隔离。方便物理内存中不相邻的内存在虚拟地址上视为连续的来使用。虚拟地址和物理地址的映射是通过MMU页表进行的。虚拟内存对实际内存有保护作用。

LeetCode(力扣)17. 电话号码的字母组合Python

LeetCode17. 电话号码的字母组合 题目链接代码 题目链接 https://leetcode.cn/problems/letter-combinations-of-a-phone-number/ 代码 class Solution:def __init__(self):self.letterMap ["", # 0"", # 1"abc", # 2"def&qu…

备战9月9日C/C++青少年等级考试(1~8级)

由中国电子学会举办的《全国青少年软件编程等级考试》将于9月9日&#xff08;周六&#xff09;举行&#xff0c;你准备的怎么样了&#xff1f;我在这里列举了1~8级的历届真题及解析&#xff0c;希望能助你考试通过&#xff01;&#xff01;&#xff01; C/C编程一级 一级标准 …

Go调用jenkins api执行流水线构建与停止

用到的库&#xff1a; "github.com/bndr/gojenkins" 代码如下&#xff0c;一次到位&#xff1a; import ("context""fmt""time""github.com/bndr/gojenkins" )// 构建指定任务 func buildJob(ctx context.Context, jenkins…

CUDA 问题 ,一直头大。。。。

1.卸载cuda ubuntu系统安装/卸载cuda和cudnn_怎么删除cudnn_Zhijun.liStudio的博客-CSDN博客ubuntu系统安装/卸载cuda和cudnn_怎么删除cudnnhttps://blog.csdn.net/weixin_45921929/article/details/128849198?ops_request_misc%257B%2522request%255Fid%2522%253A%252216939…

机器学习算法系列————决策树(二)

1.什么是决策树 用于解决分类问题的一种算法。 左边是属性&#xff0c;右边是标签。 属性选择时用什么度量&#xff0c;分别是信息熵和基尼系数。 这里能够做出来特征的区分。 下图为基尼系数为例进行计算。 下面两张图是对婚姻和年收入的详细计算过程&#xff08;为GINI系…

Hive_Hive统计指令analyze table和 describe table

之前在公司内部经常会看到表的元信息的一些统计信息&#xff0c;当时非常好奇是如何做实现的。 现在发现这些信息主要是基于 analyze table 去做统计的&#xff0c;分享给大家 实现的效果某一个表中每个列的空值数量&#xff0c;重复值数量等&#xff0c;平均长度 具体的指令…

Freecycle出现大规模数据泄露事件,影响700万用户

Freecycle是一个致力于交换二手物品的在线论坛&#xff0c;拥有来自全球5300多个地方城镇的近1100万名用户。该论坛近日发生了大规模数据泄露事件&#xff0c;700 多万用户受到影响。 该组织称是在上周三&#xff08;8月30日&#xff09;发现这一漏洞的&#xff0c;而在此之前…

Nand Flash的特性及烧录问题

目录 前言 一 Nand flash的特性 1 存储结构 2 OOB区域 3 位翻转 4 坏块及ECC 二 Nand系统裸片量产烧录 1 坏块处理策略 2 分区(Partition) 3 纠错码(Error Correction Codes&#xff0c;ECC) 4. 擦除坏块 &#x1f388;个人主页&#x1f388;&#xff1a;linux_嵌入式…

LeetCode(力扣)39. 组合总和Python

LeetCode20. 有效的括号 题目链接代码 题目链接 https://leetcode.cn/problems/combination-sum/description/ 代码 class Solution:def backtracking(self, candidates, stratindex, path, target, result, total):if total > target:returnif total target:result.ap…

php://filter协议在任意文件读取漏洞(附例题)

php://filter php://fiter 中文叫 元器封装&#xff0c;咱也不知道为什么这么翻译&#xff0c;目前我的理解是可以通过这个玩意对上面提到的php IO流进行处理&#xff0c;及现在可以对php的 IO流进行一定操作。 过滤器&#xff1a;及通过php://filter 对php 的IO流进行的具体…

React中父子组件参数传递讲解

文章目录 结合案例&#xff1a;github搜索案例1.父容器代码2.搜索Search子模块代码3.展示Lisi子模块代码 父子参数传递分析1.子(Search)传父(App)2.父(App)传子(List) 结合案例&#xff1a;github搜索案例 案例结果展示如下图 1.父容器代码 import React, { Component } fr…

经典浏览器の介绍

经典浏览器&#xff0c;这里给你介绍几款常见的浏览器&#xff1a; Google Chrome&#xff1a;Google Chrome是由Google开发的一款流行的浏览器。它以出色的性能和速度而闻名&#xff0c;能够快速加载网页。Chrome还支持大量的扩展和应用程序&#xff0c;可以个性化定制浏览器功…