【数据结构】--- 几分钟走进栈和队列(详解-下)

news/2024/5/19 0:28:19 标签: 数据结构, 流程图, c语言, 链表

文章目录

  • 前言
  • 🌟一、队列的概念及结构:
  • 🌟二、队列实现的两种方式:
  • 🌟三、队列的实现:
    • 🌏3.1队列结构:
    • 🌏3.2初始化:
    • 🌏3.3释放(类似单链表):
    • 🌏3.4入队(类似单链表尾插):
    • 🌏3.5出队(类似单链表头删):
    • 🌏3.6队头数据:
    • 🌏3.7队尾数据:
    • 🌏3.8数据个数:
    • 🌏3.9判空:
  • 🌟四、完整代码:
  • 😽总结


前言

👧个人主页:@小沈熬夜秃头中୧⍤⃝❅
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏数据结构
🔑本章内容:[数据结构]—栈和队列
送给各位💌:各花各有各花香 同致之人才懂一片风景
欢迎 评论📝 +点赞👍 +收藏😽 +关注💞哦~


提示:以下是本篇文章正文内容,下面案例可供参考

🌟一、队列的概念及结构:

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,***队列具有先进先出FIFO(First In First Out)***
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

请添加图片描述
请添加图片描述

🌟二、队列实现的两种方式:

  • 数组队列

请添加图片描述

  • 链式队列

请添加图片描述

🌟三、队列的实现:

🌏3.1队列结构:

需要定义两个结构体,一个是整个队列中每个节点的结构一个是队头指针、队尾指针和数据个数

typedef int QDataType;
typedef struct QUeueNode//每个节点的结构
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

//初始化
void QueueInit(Queue*pq);
//释放
void QueueDestroy(Queue* pq);
//尾插(入队)
void QueuePush(Queue* pq,QDataType x);
//头删(出队)
void QueuePop(Queue* pq);
//队头数据
QDataType QueueFront(Queue* pq);
//队尾数据
QDataType QueueBack(Queue* pq);
//数据个数
int QueueSize(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);

🌏3.2初始化:

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

🌏3.3释放(类似单链表):

💫3.3.1代码:

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

💫3.3.2流程图

请添加图片描述
请添加图片描述

🌏3.4入队(类似单链表尾插):

💫3.4.1代码:

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->ptail  == NULL)
	{
		assert(pq->phead==NULL);
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

💫3.4.2流程图

请添加图片描述
请添加图片描述

🌏3.5出队(类似单链表头删):

💫3.5.1代码:

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));//这里是判断pq->phead不为空
	//一个队列
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = NULL;
		pq->ptail = NULL;
	}
	//多个队列
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}

💫3.5.2流程图

请添加图片描述
请添加图片描述

🌏3.6队头数据:

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->phead->data;
}

🌏3.7队尾数据:

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->ptail->data;
}

🌏3.8数据个数:

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

🌏3.9判空:

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size==0;
}

🌟四、完整代码:

//Queue.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>

typedef int QDataType;
typedef struct QUeueNode//每个节点的结构
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

//初始化
void QueueInit(Queue*pq);
//释放
void QueueDestroy(Queue* pq);
//尾插(入队)
void QueuePush(Queue* pq,QDataType x);
//头删(出队)
void QueuePop(Queue* pq);
//队头数据
QDataType QueueFront(Queue* pq);
//队尾数据
QDataType QueueBack(Queue* pq);
//数据个数
int QueueSize(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);


//Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->ptail  == NULL)
	{
		assert(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(!QueueEmpty(pq));
	//一个队列
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = NULL;
		pq->ptail = NULL;
	}
	//多个队列
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->phead->data;
}

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->ptail->data;
}

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

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size==0;
}


//Test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void TestQueue()
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	printf("\n");
	QueueDestroy(&q);
}
int main()
{
	TestQueue();
	return 0;
}

😽总结

请添加图片描述
😽Ending,今天的栈和队列(下)的内容就到此结束啦~,如果后续想了解更多,就请关注我吧,一键三连哦 ~


http://www.niftyadmin.cn/n/327015.html

相关文章

linux标准输入/输出/错误及重定向

标准输入/输出/错误 linux下每个进程在运行的过程中都会打开一系列的文件&#xff0c;可以通过lsof -p $pid来查看进程号为pid打开的文件&#xff0c;在/proc/pid/fd/下是该进程打开的文件的链接。其中有三个比较特殊的文件是每个进程都会打开&#xff0c;其文件描述符分为0&am…

Unity3D :重要的类 - Gizmos 和 Handles

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 重要的类 - Gizmos 和 Handles Gizmos 和 Handles 类用于在 Scene 视图和 Game 视图绘制线条和形状以及交互式手柄和控件。这两个类共同提供了一种方法来扩展这些视图中显示的内容&…

如何查看Oracle控制文件中的SCN

Oracle控制文件中的SCN很多&#xff0c;最重要的有3类&#xff1a;数据库SCN、数据文件SCN和Checkpoint progress record中的SCN。数据库SCN和数据文件SCN可以分别从V$DATABASE和V$DATAFILE视图的相应列中找到&#xff0c;它们的值通常在全量CHECKPOINT时由CKPT进程更新。CHECK…

WMS 窗口添加流程

WMS 系统窗口添加流程 文章目录 WMS 系统窗口添加流程一. addView二. addView代码分析2.1 应用端调用WindowManager的addView2.2 WindowManager的实现类是WindowManagerImpl2.3 WindowManagerGlobal2.4 setView2.4 addToDisplayAsUser&#xff08;Session.java&#xff09;2.5 …

EEPROM读写测试实验(主要记录IIC通信协议)

一、简介 EEPROM&#xff0c;电可擦除可编程只读存储器&#xff0c;是一个非易失性的存储器件。RAM&#xff1a; 随机访问存储器&#xff0c;可读也可写&#xff0c;断电不保存数据&#xff0c;常用的RAM有ddr3、SDRAM。ROM仅支持读&#xff0c;不可写&#xff0c;但断电可以保…

STM32-ADC过采样实验

我们之前已经有过一些关于STM32-ADC的笔记和实验代码了&#xff0c;链接如下&#xff1a; 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 STM32-单通道ADC采集&#xff08;DMA读取&#xff09;实验_Mr_rustylake的博客-…

库存管理之调拨、盘点、报损

随着企业规模的不断扩大和业务范围的日益复杂&#xff0c;库存管理成为了企业不可或缺的重要环节。在库存管理中&#xff0c;调拨、盘点和报损是比较常用的操作&#xff0c;下面将分别介绍这三种操作的概念和实践方法。 调拨 调拨指的是从一个库存地点向另一个库存地点移动产品…

人员效率提升的有力武器:探讨客服系统在企业中的应用

现在市场中&#xff0c;客户对企业的服务要求越来越严格&#xff0c;客户服务质量的高低甚至会影响企业的销售额。所以&#xff0c;关注客户服务对于企业&#xff0c;特别是中小企业来讲是一项非常重要的工作。而客服系统则能在客户服务中帮助企业提高客户满意度和忠诚度、提升…