数据结构——队列(C++实现)

这篇具有很好参考价值的文章主要介绍了数据结构——队列(C++实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

队列的概念及结构

 队列的实现

队列的代码实现

完整的源文件代码

总结

推荐题目巩固知识


队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除操作的特殊线性表,队列最重要的特性是先进先出(First In First Out)

入队列:进行插入操作的一端称为队尾

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

下面来看一下图片理解队列的结构

c++队列,数据结构,链表

 队列的实现

队列可以使用数组实现,也可以使用链表实现,但是相对于数组,使用链表会更优一些。因为如果使用数组的话,出队列的时候,是出在数组的第一个元素,需要将后面的元素都往前移动一个位置,会增加了O(N)的时间复杂度,效率会比较低。

入队列:

c++队列,数据结构,链表

出队列: 

c++队列,数据结构,链表

队列的代码实现

队列有初始化队列、插入元素、删除元素、判断队列是否为空、队列的大小(即元素个数)、输出队头元素、输出队尾元素、释放内存

队列的头文件

#pragma once

struct QueueNode
{
	int data;
	QueueNode* next;
};

struct Queue
{
	QueueNode* head;
	QueueNode* tail;
};

//初始化队列
void QueueInit(Queue* q);

//插入数据
void QueuePush(Queue* q, int x);

//删除数据
void QueuePop(Queue* q);

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

//队列大小
int QueueSize(Queue* q);

//输出队头数据
int QueueFront(Queue* q);

//输出队尾数据
int QueueBack(Queue* q);

//释放内存
void QueueDestroy(Queue* q);

1、初始化队列

每次创建一个队列,我们都应该先对它进行初始化

//初始化队列
void QueueInit(Queue* q)
{
	assert(q);
	q->head = NULL;
	q->tail = NULL;
}

2、插入元素

在队尾插入元素

//插入数据
void QueuePush(Queue* q, int x)
{
	QueueNode* newNode = new QueueNode;
	newNode->data = x;
	newNode->next = NULL;
	if (q->head == NULL)
	{
		q->head = q->tail = newNode;
	}
	else
	{
		q->tail->next = newNode;
		q->tail = newNode;
	}
}

3、删除元素

在队头删除元素

//删除数据
void QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	QueueNode* next;
	next = q->head->next;
	delete q->head;
	q->head = next;

	//避免野指针问题
	if (q->head == NULL)
		q->tail = NULL;
}

4、队列是否为空

判断队列是否为空,若为空,返回真,若不为空,则返回假

//判断队列是否为空
bool QueueEmpty(Queue* q)
{
	return q->head == NULL;
}

5、队列的大小(即队列中元素的个数)

//队列大小
int QueueSize(Queue* q)
{
	assert(q);
	int n = 0;
	QueueNode* cur;
	cur = q->head;
	while (cur)
	{
		n++;
		cur = cur->next;
	}
	return n;
}

6、输出队头元素

//输出队头数据
int QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	return q->head->data;
}

7、输出队尾元素

//输出队尾数据
int QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	return q->tail->data;
}

8、销毁队列,释放内存

因为我们是动态添加元素,会使用到new ,所以必定需要有delete来释放内存空间

//释放内存
void QueueDestroy(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	QueueNode* cur = q->head;
	while (cur)
	{
		QueueNode* next = cur->next;
		delete cur;
		cur = next;
	}
	q->head = q->tail = NULL;
}

完整的源文件代码

#include"Queue.h"
#include<assert.h>

//初始化队列
void QueueInit(Queue* q)
{
	assert(q);
	q->head = NULL;
	q->tail = NULL;
}

//插入数据
void QueuePush(Queue* q, int x)
{
	QueueNode* newNode = new QueueNode;
	newNode->data = x;
	newNode->next = NULL;
	if (q->head == NULL)
	{
		q->head = q->tail = newNode;
	}
	else
	{
		q->tail->next = newNode;
		q->tail = newNode;
	}
}

//删除数据
void QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	QueueNode* next;
	next = q->head->next;
	delete q->head;
	q->head = next;

	//避免野指针问题
	if (q->head == NULL)
		q->tail = NULL;
}

//判断队列是否为空
bool QueueEmpty(Queue* q)
{
	return q->head == NULL;
}

//队列大小
int QueueSize(Queue* q)
{
	assert(q);
	int n = 0;
	QueueNode* cur;
	cur = q->head;
	while (cur)
	{
		n++;
		cur = cur->next;
	}
	return n;
}

//输出队头数据
int QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	return q->head->data;
}

//输出队尾数据
int QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	return q->tail->data;
}

//释放内存
void QueueDestroy(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	QueueNode* cur = q->head;
	while (cur)
	{
		QueueNode* next = cur->next;
		delete cur;
		cur = next;
	}
	q->head = q->tail = NULL;
}

总结

队列最重要的特点是先进先出,我们在做题或者做项目的时候要注意这一点

推荐题目巩固知识

1. 括号匹配问题。力扣https://leetcode-cn.com/problems/valid-parentheses/

2. 用队列实现栈。力扣https://leetcode-cn.com/problems/implement-stack-using-queues/

3. 用栈实现队列。力扣https://leetcode-cn.com/problems/implement-queue-using-stacks/文章来源地址https://www.toymoban.com/news/detail-724657.html

到了这里,关于数据结构——队列(C++实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构--队列的链表实现

    初始化 判断队列是否为空 入队 初始化 判断队列是否为空 入队 队满 链式存储――一般不会队满,除非内存不足

    2024年02月11日
    浏览(33)
  • Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍   文章目录         1.0 队列的说明         1.1 队列的几种常用操作         2.0 使用链表实现队列说明         2.1 链表实现队列         2.2 链表实现队列 - 入栈操作         2.3 链表实现队

    2024年02月05日
    浏览(27)
  • 数据结构:队列(链表和数组模拟实现)

    目录 1.何为队列 2.链表模拟实现 2.1 节点和队列创建 2.2 初始化队列 2.3 入队操作 2.4 出队操作 2.5 遍历队列 2.6 获取队首和队尾元素 2.7 判断队列是否为空 2.8 完整实现 3. 数组模拟实现 3.1 创建队列 3.2 入队和出队操作 3.3 遍历队列 3.4 获取队首和队尾元素  3.5 判断队列是否为空

    2024年02月03日
    浏览(35)
  • 【C++】【数据结构】循环队列的基本操作(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度)顺序队列的算法实现【附全代码】

    使用c++完成数据结构循环队列的基本操作,包括(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度等),可直接编译运行。 队列 又称为 “先进先出” (FIFO)线性表。限定插入操作只能在队尾进行,而删除操作只能在队首进行。 循环队列 ——采用 顺序存储结构

    2023年04月16日
    浏览(38)
  • C++数据结构之队列详解

    队头填充进四个元素 此时思考一个问题,当删除元素时(元素出队列时)会出现假饱和的情况,如上图m_data[0]和m_data[1]再进行出队列操作之后,这两个位置可以容纳新的元素,但m_rear没有回到原本的m_data[0]位置,因此需要引入一个新的队列结构,环形队列,m_rear这个位置可以

    2024年02月05日
    浏览(29)
  • 数据结构——优先队列c++详解

    百度百科定义 优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min priority queue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操

    2024年02月09日
    浏览(25)
  • C++数据结构之链表(详解)

    主要参考文章地址 01.链表基础知识 | 算法通关手册 (itcharge.cn)) 本次内容是对链表的总结,可以看了上面的文章之后。 在看我下面的内容,做一个简短的复习,且本内容的代码均用C++实现,而参考资料的代码则为python。 每一个标题都有一个完整的链接,也可以点击下面的链

    2024年02月15日
    浏览(55)
  • 【c++学习】数据结构中的链表

    链表与线性表相对,链表数据在内存中的存储空间是不连续的,链表每个节点包含数据域和指针域。 下述代码实现了链表及其接口 包括增、删、查、改以及其他一些简单的功能 运行结果: 于 2024-01-23 第一次整理编写 学习时整理,不当之处烦请指正 码字不易,留个赞再走吧

    2024年01月24日
    浏览(38)
  • 链表综合算法设计(c++数据结构)

      一、设计内容 已知简单的人事信息系统中职工记录包含职工编号(no)、职工姓名(name)、部门名称(depname)、职称(title)和工资数(salary)等信息(可以增加其他信息),设计并完成一个简单的人事信息管理系统,要求完成但不限于以下功能: (1)    增加一个职工信息

    2024年02月02日
    浏览(41)
  • C++数据结构与算法——栈与队列

    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注! 请你仅使用两个栈实现先入先出队列。队列应当

    2024年02月20日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包