当前位置: 首页 > article >正文

【数据结构与算法】第7课—数据结构之队列

文章目录

  • 1. 队列
    • 1.1 什么是队列
    • 1.2 队列的结构
    • 1.3 队列初始化
    • 1.4 队列入栈
    • 1.5 出队列
    • 1.6 查找队列有效元素个数
    • 1.7 取队头和队尾数据
    • 1.8 销毁链表
  • 2. 用两个队列实现栈
  • 3. 用两个栈实现队列
  • 4. 循环队列

1. 队列

  • 注:文中Queue是队列,Quene是错误写法

1.1 什么是队列

  • 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
  • 栈只允许在栈顶进行插入数据删除数据的操作,称为入栈、出栈(或压栈)
  • 队列则是队尾进队头出,满足先进先出的原则,而栈则是后进先出

在这里插入图片描述


1.2 队列的结构

在这里插入图片描述


typedef int QueueDataType;
//定义队列节点的结构
typedef struct QueueNode
{
	QueueDataType data;
	struct QueueNode* next;
}QueueNode;

//定义队列的结构
typedef struct Queue
{
	QueueNode* phead;//队头
	QueueNode* ptail;//队尾
}Queue;

1.3 队列初始化

在这里插入图片描述


1.4 队列入栈

在这里插入图片描述


//入队列
void QueuePush(Queue* pq, QueueDataType x)
{
	assert(pq);
	//申请节点
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode== NULL)
	{
		perror("malloc fail!\n");
		exit(1);
	}
	newnode->data = x;
	newnode->next = NULL;
	//队列为空,队头队尾都是newnode
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	//队列不为空
	else
	{
		pq->ptail->next = newnode;
		//pq->ptail往后走
		pq->ptail = pq->ptail->next;
	}
}

1.5 出队列

在这里插入图片描述


//队列判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->phead == NULL;
}

//出队列--头删
void QueuePop(Quene* pq)
{
	assert(pq && !QueueEmpty(pq));
	//队列只有一个有效数据
	if (pq->phead == pq->ptail)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	//队列有多个有效数据
	else
	{
		QueueNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
		
}

1.6 查找队列有效元素个数

在这里插入图片描述


//查找队列有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);
    //第一种
	//int size = 0;
	//QueueNode* pcur = pq->phead;
	//while (pcur)
	//{
	//	size++;
	//	pcur = pcur->next;
	//}
	//return size;

	//第二种
	return pq->size;
}

1.7 取队头和队尾数据

在这里插入图片描述


1.8 销毁链表

在这里插入图片描述


2. 用两个队列实现栈

  • 栈的结构

在这里插入图片描述


  • 栈的初始化

在这里插入图片描述


  • 入栈

在这里插入图片描述


  • 出栈----取栈顶元素

在这里插入图片描述


  • 返回栈顶元素

在这里插入图片描述


  • 判断栈是否为空和销毁栈

在这里插入图片描述


3. 用两个栈实现队列

在这里插入图片描述


  • 自定义的队列的数据结构

在这里插入图片描述


  • 队列的初始化

在这里插入图片描述


  • 入队和出队

在这里插入图片描述


在这里插入图片描述


  • 判断队列是否为空和销毁队列

在这里插入图片描述


4. 循环队列

在这里插入图片描述


  • 循环队列初始化

在这里插入图片描述


  • 判断循环队列是否为空循环队列是否满了

在这里插入图片描述


  • 循环队列插入元素

在这里插入图片描述


  • 循环队列出队列

在这里插入图片描述


  • 循环队列取队头和队尾

在这里插入图片描述


  • 释放循环队列

在这里插入图片描述



http://www.kler.cn/a/374639.html

相关文章:

  • vscode摸鱼学习插件开发
  • css 在 hover 子元素时,不要让父元素触发 hover 效果
  • 【C++滑动窗口】2653. 滑动子数组的美丽值|1785
  • 107. 阴影范围.shadow.camera
  • 2024-10-30 学习人工智能的Day18
  • 臻于智境 安全护航 亚信安全受邀出席新华三智算新品发布会
  • 超子物联网HAL库笔记:准备篇
  • Hive的数据存储格式
  • 设计模式 策略模式 场景Vue (技术提升)
  • WebMvcConfigurer
  • React 中useState 原理
  • JIME智创:抖音创作者的AI绘画与视频生成创作神器
  • 无人机之卫星通信技术篇
  • ‌Spring MVC的主要组件有哪些?
  • Redis常见面试题总结(下)
  • Redis高频面试题
  • Oracle 大表添加索引的最佳方式
  • 深度学习:YOLO v1网络架构、损失值及NMS极大值抑制
  • DIY可视化-uniapp悬浮菜单支持拖动、吸附-代码生成器
  • 【MySQL】 运维篇—安全管理:防止SQL注入与其他安全威胁
  • 数据库开发
  • Android Studio Dolphin 下载、安装与配置教程
  • 实现RPC接口的demo记录
  • 从传感器到清洁力提升,灵途科技推动家电智能化发展
  • Linux的硬盘管理
  • AI人工智能电话机器人如何使用效果最好