【数据结构与算法】无队头指针的队列置空队、判队空 、入队和出队算法

news2024/11/25 6:30:31

题目

   Qestion: 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点 (注意不设头指针) ,试编写相应的置空队判队空入队出队等算法。


核心思路

  该队列的特殊之处:

  • 用链表来表示队列
  • 该链表为带头节点的链表
  • 该队列无头指针,只有尾指针


    解决本题的思路:
  • 使用Q.rear->next来表达头节点
  • 使用Q.rear->next->next来表示首元结点


    需要注意的点:
  • 出队的时候需要进行判断,出队的结点是否为最后一个结点。
  1. 入队的结点从队尾进入,也就是Q.rear所指的结点,出队的结点从队头出队,也就是头节点的next,用尾指针来表示就是Q.rear->next->next
  2. 队空的条件是队列中只含一个结点,也就是头节点,或者用Q.length == 0 来判断也可以;
  3. 置队空的方式为判断队伍是否为空,若为false则进行出队操作,直到该队列只剩下一个头节点。
  4. 入队的流程大致为:先创建一个新的结点newNode并且将其接到队伍的最后面(保持整个链不断),再将Q的尾指针Q.rear指向新结点,最后让Q.length++
  5. 出队的大致流程为:先创建一个临时指针指向首元结点(即将出队的结点),根据其是否为最后一个结点进行分别的删除操作,释放首元结点的空间,使Q.length--;

核心代码

该题解的核心代码


图解

enQueue(入队)算法

在这里插入图片描述
在这里插入图片描述

deQueue(出队)算法

在这里插入图片描述


全部代码(可运行文件)

/*
3、算法设计:假设以带头结点的循环链表表示队列,
并且只设一个指针指向队尾元素结点(注意不设头指针) ,
试编写相应的置空队、判队空 、入队和出队等算法。

出队入队顺序:队尾进入,队头出
队头出队,队尾入队
*/

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
struct LNode
{
	int data;
	LNode *next;
};

typedef struct
{
	LNode *rear;
	int length;
} Queue;

// 初始化
void InitQueue(Queue &Q)
{
	LNode *head = new LNode;
	head->next = head; // 头节点的next指向自己(循环)
	head->data = 999;
	Q.rear = head; // 尾指针指向头指针
	Q.length = 0;
}
// 入队
void enQueue(int x, Queue &Q)
{
	LNode *newNode = new LNode;
	if (!newNode)
	{
		return;
	}
	else
	{
		newNode->data = x;
		newNode->next = Q.rear->next; // 新节点的next指向头节点
		Q.rear->next = newNode;
		Q.rear = newNode; // 尾指针指向新节点
		Q.length++;		  // 队长+1
	}
}

// 出队
void deQueue(Queue &Q)
{
	LNode *tmp = Q.rear->next->next; // 使用一个临时指针tmp,用于指向首元节点
	if (Q.length > 1)
	{
		Q.rear->next->next = tmp->next; //  头节点的next连接到首元节点的next节点,也就是把首元节点与整个链表的联系断了
	}
	else
	{
		Q.rear = Q.rear->next;
		Q.rear->next = Q.rear;
	}
	free(tmp);	// 释放首元节点(队头元素)
	Q.length--; // 队长-1
}

// 打印当前列表的情况
void PrintQueue(Queue Q)
{
	LNode *tmp = Q.rear->next->next;
	while (tmp != Q.rear->next)
	{
		printf("%d\n", tmp->data);
		tmp = tmp->next;
	}
}
// 判断队空
bool IsQueueEmpty(Queue Q)
{
	if (Q.rear->next->next == Q.rear->next) // 头节点的next指向它自己
		return true;
	else
		return false;
}

// 置队空
void SetQueueEmpty(Queue &Q)
{
	while (!IsQueueEmpty(Q))
	{
		deQueue(Q);
	}
	printf("当前队列已经置空");
}

int main()
{
	Queue Q;
	InitQueue(Q);
	if (IsQueueEmpty(Q))
	{
		printf("queue is empty\n");
	}
	else
	{
		printf("queue isn't empty\n");
	}
	enQueue(1, Q);
	SetQueueEmpty(Q);
	enQueue(2, Q);
	enQueue(3, Q);
	enQueue(4, Q);
	SetQueueEmpty(Q);
	if (IsQueueEmpty(Q) == true)
	{
		printf("queue is empty\n");
	}
	else
	{
		printf("queue isn't empty\n");
	}
	PrintQueue(Q);
	return 0;
}


结束语

   因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

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

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

相关文章

VM ware workstation安装mac虚拟机

一. 工具准备 VMware workstation mac os的镜像文件&#xff08;链接&#xff1a;https://pan.baidu.com/s/1AdDGFU186bqKvW4wuGtpqw &#xff0c;提取码&#xff1a;tdvc&#xff09; 下载一个auto-unlocker文件&#xff08;https://github.com/paolo-projects/auto-unlocke…

人工智能十大流行算法,通俗易懂讲明白

人工智能是什么&#xff1f;很多人都知道&#xff0c;但大多又都说不清楚。 事实上&#xff0c;人工智能已经存在于我们生活中很久了。 比如我们常常用到的邮箱&#xff0c;其中垃圾邮件过滤就是依靠人工智能&#xff1b;比如每个智能手机都配备的指纹识别或人脸识别&#x…

「QT」QT中new的对象不需要delete的原因

博客主页:何曾参静谧的博客 文章专栏:「QT」QT5快速学习 目录 说明注意事项说明 在QT中,一般来说,通过new关键字创建的对象由QT的对象树来管理,而通过其他方式创建的对象就需要手动释放。QT的对象树可以看做是QT提供的一种内存管理机制,它能够自动地管理和释放对象的内存…

Xilinx之7系列时钟规划失败解析

目录 一 、前言 二、时钟规划 ​2.1 时钟单元经过非时钟路径 2.2 资源不足 2.3 跨半区 一 、前言 在设计的工程中&#xff0c;经常会在implementation的布局或布线阶段失败&#xff0c;下面将针对xilinx 7系列时钟规划失败的场景进行分类描述。本文示例器件为xc7k480tffv1…

华为笔记本怎么录屏?分享2个实用方法

案例&#xff1a;如何对华为笔记本电脑进行屏幕录制&#xff1f; 【今天刚刚了解到电脑可以录屏&#xff0c;但是我拿着我的华为电脑找了半天&#xff0c;也找不到它的屏幕录制功能在哪。华为电脑录屏功能在哪&#xff1f;华为笔记本怎么录屏&#xff1f;有没有大神可以教教我…

DNS缓存失效,nginx死循环访问造成连接数瞬间飚高的问题

0.背景介绍 某服务domain.com.cn 之前DNS解析到服务真实地址10.1.1.11&#xff0c;后面需要对用户登录增加黑名单功能&#xff0c;于是在openresty针对服务domain.com.cn的特性完成了黑名单功能。黑名单功能已经上线几个月&#xff0c;但是DNS从服务真实地址10.1.1.11切换到ope…

Spring MVC 参数解析(13)

目录 简介 调用流程 1. 首先&#xff0c;还是需要进行到前端控制器的doDispatch方法&#xff0c;这是我们的调用Spring MVC的核心入口方法 2. 在doDispatch方法内部&#xff0c;我们调用到了HandlerAdapter.handle(*****) 方法 3. 最终&#xff0c;我们会来到 RequestMappi…

完美解决丨2. `TypeError: list indices must be integers or slices, not str`

‘tuple’ object does not support item assignment 原因&#xff1a; tuple 是一个元素不可变的列表&#xff0c;如果尝试对 tuple 中的某个元素进行修改&#xff0c;会报错。 解决办法&#xff1a; 需要将 tuple 转换为 list&#xff0c;然后再把 list 转换为 tuple。 示例…

最长公共上升子序列LCIS

最长公共上升子序列LCIS 题目链接: acwing272. 最长公共上升子序列 题目描述: 输入输出: 题解: 首先考虑 最长上升子序列和 最长公共子序列问题 最长上升子序列的状态表示与状态转移如下: 状态表示: 用f[i],来表示以A[i]结尾的A[1~i]最长上升子序列的长度(注意&#xff0c;该上…

WPF教程(三)--事件Event调用

1、WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时&#xff0c;应用程序才停止运行。 ShutDown 是隐式或显式发生&#xff0c;可以通过指定 ShutdownMode 的属性值来进行设置。 对ShutdownMode选项的更改&#xff0c;可以直接在App.xaml中更改&a…

coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)

目录 1 生产者 数据源 1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据 1.2 match-server接收 前端发给Exchange-server的数据 2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性 3.Order转成 OrderEvent 4. 分配序号发布…

【初学ROS,年轻人的第一个Node节点】

【初学ROS&#xff0c;年轻人的第一个Node节点】 1. 工作空间设置2. 创建Package3. 回访依赖包4. 创建Node节点5. 源码编译6. 运行Node节点7. Node节点完善8. 总结 本教程是B站阿杰视频的笔记 视频地址&#xff1a;https://www.bilibili.com/video/BV1nG411V7HW 超声波传感器 …

界面组件DevExtreme v22.2新版亮点 - 各UI组件增强升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

geometric distribution and exponential distribution(几何分布和指数分布)

几何分布 分布函数均值和方差意义 表示经过k次实验才第一次得到正确的实验结果 比如抛硬币得到正面的需要抛的次数 指数分布 分布函数均值和方差意义 表示经过一段x之后&#xff0c;某件事第一次发生 比如经过x时间之后&#xff0c;公交车来的概率 比如餐厅从开业到第一个客人…

基于ArcGIS 服务获取气象栅格某点位值及数据更新

1. 背景 假如有很多气象数据&#xff0c;不想通过后台脚本去获取数据&#xff0c;想通过前台服务的rest接口去识别&#xff0c;并且这些栅格数据可能是需要更新变化的&#xff0c;以下对一些技术方法做一个简单的介绍。 需求概述&#xff1a; 点击某一个点&#xff0c;获取影…

设计模式 --- 概述

一、设计模式概述 1.1、软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任 克里斯托夫亚历山大 &#xff08;Christopher Alexander&…

c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式

c/c:三维数组&#xff0c;字符数组和字符串&#xff0c;统计字符串中字符出现的频次&#xff0c;scanf输入空格&#xff0c;正则匹配表达式 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知…

WPF教程(十一)---数据绑定(4)--数据类绑定

一、排序 如果想以特定的方式对数据进行排序&#xff0c;可以绑定到 CollectionViewSource&#xff0c;而不是直接绑定到 ObjectDataProvider。CollectionViewSource 则会成为数据源&#xff0c;并充当截取 ObjectDataProvider 中的数据的媒介&#xff0c;并提供排序、分组和筛…

PMP项目管理-[第六章]进度管理

进度管理知识体系&#xff1a; 规划进度管理&#xff1a; 定义活动&#xff1a; 排列活动顺序&#xff1a; 估算活动持续时间&#xff1a; 制定进度计划&#xff1a; 6.1 规划进度管理 定义&#xff1a;为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档的过程 作…

docker简单教程(三)常用操作

docker简单教程&#xff08;三&#xff09;常用操作 文章目录 docker简单教程&#xff08;三&#xff09;常用操作1&#xff1a;查看所有容器列表&#xff1a;docker ps -a2&#xff1a;查看正在运行的容器列表&#xff1a;docker ps3&#xff1a;运行容器&#xff1a;docker r…