竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解

2023-10-28

队列的模拟实现

队列是什么

队列是一种数据结构,遵循的是先进先出,后进后出的原则,基于这个原则我们可以借助数组进行模拟实现。

实现过程

实现原理

借助两个变量head和tail模拟实现队列的队头和队尾,出队列即让head++,入队即让tail++,即可借助数组实现模拟的队列过程

具体代码实现

#include <iostream>
using namespace std;
#define max 5

int queue[max] = { 0 };
int head = 0;
int tail = 0;

void Push(int num)
{
	if (tail >= max)
	{
		cout << "full!" << endl;
	}
	else
	{
		queue[tail] = num;
		tail++;
		cout << "successfully!" << endl;
	}
}

void Pop()
{
	if (head >= tail)
	{
		cout << "empty!" << endl;
	}
	else
	{
		head++;
		cout << "sucessfully!" << endl;
	}
}

void Display()
{
	for (int i = head; i < tail; i++)
	{
		cout << queue[i] << " ";
	}
	cout << endl;
}

int main()
{
	int num = 0;
	int opt = 1;
	while (opt)
	{
		cout << "1.push 2.pop 3.display 0.exit" << endl;
		cout << "your choice:->" << endl;
		cin >> opt;
		switch (opt)
		{
		case 1:
			cout << "your num:->";
			cin >> num;
			Push(num);
			break;
		case 2:
			Pop();
			break;
		case 3:
			Display();
			break;
		default:
			cout << "try again" << endl;
		}
	}
	return 0;
}

那么事实上,这样做确实可以达到目的,通过运行可以发现达到了最开始的想法,pop和push可以实现队列的整个过程

但与此同时,问题在于对于数组的利用有很大问题,出队后前面的部分就被荒废了,如果数组满了想要继续入队是不可行的,那么如何把这部分内容利用起来?于是我们就想到可以把前面的循环利用一下,这样就引出了循环数组的概念。

循环数组

循环数组是什么?

循环数组就是相当于把数组变成一个环形的数组,可以不断向里面存储内容

循环数组如何实现队列?

实现原理

我们要进行循环数组的原因就是前面的部分不能被充分利用,那么我们假设空出来一个格子不利用,专门用来进行循环。

图解如下:

在这里插入图片描述

由上图可以知道循环数组的原理就是少存储一个格子,而这个格子就是我们用来循环使用的,当tail指向最后一个格子而前面head没有出队的时候,此时就是队满了,而当head向前推进时,tail就可以循环到前面第一个格子,核心就是怎么进行这样的循环。
循环的原理就是head=(head+1)%maxn
maxn就是数组的大小。

//循环数组实现队列的模拟实现

#include <iostream>
using namespace std;
#define maxn 5

int queue[maxn];
int head = 0;
int tail = 0;

void Push(int num)
{
	queue[tail] = num;
	tail = (tail + 1) % maxn;
}

int Pop()
{
	int r = queue[head];
	head = (head + 1) % maxn;
	return r;
}

void Display()
{
	for (int i = head; i != tail; i = (i + 1) % maxn)
	{
		cout << queue[i] << " ";
	}
	cout << endl;
}

int main()
{
	int opt = 1;
	while (opt)
	{
		cout << "1.push 2.pop 3.display 0.exit" << endl << "your choice:->";
		cin >> opt;
		int num = 0;
		switch (opt)
		{
		case 1:
			if ((tail + 1) % maxn == head)
			{
				cout << "队列已满" << endl;
			}
			else
			{
				cin >> num;
				Push(num);
			}
			break;
		case 2:
			int r;
			if (head == tail)
			{
				cout << "队列为空" << endl;
			}
			else
			{
				r = Pop();
				if (r != -1)
					cout << r << " has pop" << endl;
			}
			break;
		case 3:
			Display();
			break;
		default:
			cout << "重新选择" << endl;
		}
	}
	return 0;
}

从这里看到和前面的比起来有一些区别,区别在于head和tail的增减情况发生了变化,原来只需要++现在变成了++后还要取模运算,而其实在取模运算的过程就是一个循环的过程。

总结

循环数组确实提供了一个全新思路,在很多题目中可以用循环数组解决一些看似很难的问题。
如有不对请多多指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • UE4_Python_自动化导入素材脚本_音频_图片_FBX

    1 新建项目 开启插件 2 项目设置 gt Python 3 资源加载脚本 AssetFunctions py 目录跟上图的目录一致 导入FBX import unreal asset path E fireAxe FBX asset pa
  • Blender 3.5 面的操作(二)

    目录 1 面操作 1 1 面的切割 1 2 整体切分 1 3 面的法向 1 4 正面 背面 1 5 翻转法向 1 6 填充面 1 7 面倒角 1 8 循环面 1 9 X Ray 透视模式 1 面操作 1 1 面的切割 切割工具 Knife
  • 服务器vmware新建虚拟机教程,如何创建虚拟机教程全解

    这部分教程我们将学习的是如何创建虚拟机 在创建虚拟机之前 vSphere Client是必要的软件之一 它用于访问ESX主机或vCenter的图形管理用户界面 vSphere Client安装在Windows计算机上 它是与虚拟基础架构进行
  • eclipse的workspace删除

    在最近的一个爬虫项目中 发现build进程很慢 然后就换了个workspace 但还是很慢最后也出错了 然后想删除这个workspace 我尝试删除了F盘对应的workspace文件夹 但是令人不解的是 eclipse竟然还可以switch
  • linux上安装和启动docker

    1 安装Docker 这里我们将Docker安装到CentOS7上 最好是将yum更新下 sudo yum update 2 安装需要的软件包yum util 如果不安装则第三步会出现yum config manager command n
  • 性能测试---LoadRunner

    目录 1 LoadRunner对比Jmeter的优势 2 LoadRunner三个组件之间的关系 3 学习VUG的使用 3 1创建性能测试脚本并进行录制 第一步 打开VUG 创建一个新的性能测试的脚本 第二步 对新建的脚本进行设置 第三步
  • macbook pro适合python编程么_编程应该选macbook pro还是thinkpad T(从性能角度出发)?...

    谢邀 背景 工作中要是用Python C 和一点点Java 需要用到很多机器学习算法 首先我把几个机型的推荐款列一下 所有机型 8代CPU版本 仅推荐该系列i5款 ThinkPad X系列 推荐X390 个人认为X系列近几年最良心的产品 性
  • 如何编译Python文件?

    编译Python文件 一 编译Python文件 二 批量生成 pyc 文件 一 编译Python文件 为了提高加载模块的速度 强调 强调 强调 提高的是加载速度而绝非运行速度 python解释器会在 pycache 目录中下缓存每个模块编译
  • PRD概述

    一 Pentaho 整体架构 cc 二 Client tools 1 Report Designer 报表创建工具 如果想创建复杂数据驱动的报表 这是合适工具 2 Design Studio 这是基于eclipse的工具 你可以使用它来创建
  • 更改Ubuntu软件镜像为清华镜像 sourcelist

    1 将原始的source list复制替换 sudo cp etc apt sources list etc apt sources list old 2 使用vim打开source list sudo vim etc apt source
  • STM32F103移植RT-Thread完整过程

    前言 RT Thread官网有很多通过IDE一键移植的方法 本文选择的是手动移植 文末提供移植好的完整工程 RT Thread 有3个版本 分别是标准版本 Nano版本 Smart版本 本文选择的是最简单的Nano版本 RT Thread
  • TMS320F28377X芯片SCI模块RS485通信,数据末尾被0xFF替换的问题解决

    SCI串口通信 用RS232方式 SCI模块 用如下的 直接这样 就可以发送 void Write SCIC Uint8 pBuf Uint16 len rs232 Uint16 i for i 0 i lt len i while Sci
  • 如何打包jar

    http www 2cto com kf 201204 129495 html 方法一 通过jar命令 jar命令的用法 下面是jar命令的帮助说明 用法 jar ctxui vfm0Me jar file manifest file en
  • Redis Cluster常用命令

    创建一个Redis Cluster redis cli cluster create host1 port1 host2 port2 host3 port3 查看node信息 redis cli p 7000 cluster nodes R
  • Excel 冻结窗格 - 锁定表格行和列

    Excel 冻结窗格 锁定表格行和列 在 Excel 中 冻结窗格用于实现锁定表格行和列的功能 如果表格的行数 列数较多时 一旦滚动屏幕 则标题行 列跟着滚动 在处理数据时难以分清各行 列数据对应的标题 冻结的标题增强表格编辑的直观性 在
  • springboot读取yml配置文件的三种方式

    文章目录 1 yml示例 2 Value 3 Environment 4 ConfigurationProperties 1 yml示例 name 胡思源 对象 person name name age 1 数组 aoteman 迪迦 赛罗
  • AlphaZero 完爆前辈 AlphaGo,这个人工智能新突破价值有多大?(转)

    原文地址 http 36kr com p 5106157 html 谷歌旗下人工智能公司 DeepMind 发布了一篇新论文 它讲述了团队如何利用 AlphaGo 的机器学习系统 构建了新的项目 AlphaZero AlphaZero 使用
  • Ubuntu上使终端显示Git分支(oh-my-zsh)

    oh my zsh是基于Zsh Zsh是一个Linux用户很少使用的power shell 这是由于大多数Linux产品安装 以及默认使用bash shell 的功能作了一个扩展 方便插件管理 主体自定义等 oh my zsh源码在 htt
  • AVPlayer AVPlayerItem cannot service a seek request with a completion handler until its status is AV

    AVPlayer seek时闪退 1832 398446 Terminating app due to uncaught exception NSInvalidArgumentException reason AVPlayerItem ca
  • 竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解

    文章目录 队列的模拟实现 队列是什么 实现过程 实现原理 具体代码实现 循环数组 循环数组是什么 循环数组如何实现队列 实现原理 总结 队列的模拟实现 队列是什么 队列是一种数据结构 遵循的是先进先出 后进后出的原则 基于这个原则我们可以借