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

article/2025/9/22 21:09:41

文章目录

  • 队列的模拟实现
    • 队列是什么
    • 实现过程
      • 实现原理
      • 具体代码实现
  • 循环数组
    • 循环数组是什么?
    • 循环数组如何实现队列?
      • 实现原理
  • 总结

队列的模拟实现

队列是什么

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

实现过程

实现原理

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

具体代码实现

#include <iostream>
using namespace std;
#define max 5int 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 5int 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的增减情况发生了变化,原来只需要++现在变成了++后还要取模运算,而其实在取模运算的过程就是一个循环的过程。

总结

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


http://chatgpt.dhexx.cn/article/6rV2H51f.shtml

相关文章

循环数组、对象的方法(超实用)

&#xff08;前言&#xff1a;每一个方法我都会举例说明&#xff0c;为了避免混淆&#xff0c;所有方法例子中都使用同一个数组arr和对象obj&#xff1b;另外&#xff0c;由于 forEach太low&#xff0c;every太不常用&#xff0c;所以直接略过&#xff09; 1. for in &#x…

循环数组 及 实现

数组 是一种 线性结构&#xff0c; 在内存中是一段 连续的内存 存储空间存储。 那么 如何实现循环的数组呢&#xff1f; 什么是循环数组&#xff1f; 循环数组 就是 数组的头尾是相连的。 假如有一个数组 [3,7,2,9,1,5] , 形成的环形数组 如下图&#xff1a; 用代码实现&am…

js数组转换为数组对象

let arr ["刘备","关羽","张飞","赵云","马超","黄忠"]; let obj {}; // 将数组转化为对象 for (let key in arr) {obj[key] arr[key];}; let newObj Object.keys(obj).map(val > ({label: obj[val],value…

js 数组转对象方法

记录将数组转成对象方法 let array [1,2,3,4,5]; let obj {}; obj Object.assign({}, array) console.log(obj); // {1,2,3,4,5}

js数组添加对象

一般业务都会有在数组里添加对象属性的需求 以下列出几种常见的添加对象的方法供大家参考 一、最常见的方法&#xff1a;push&#xff08;尾部添加&#xff09; 业务场景 arr [{num:1},{num:2},{num:3}];newArr arr.push({num:4})console.log(arr) 结果&#xff1a; 二、…

js 多维数组/对象转一维数组对象

多维对象转数组&#xff1a; let objTree {name: 河南,children: {name: 洛阳,children: {name: 洛宁,children: {name: 兴华,},},},}function toList(obj, listre) {for (let key in obj) {if (typeof obj[key] object) {console.log(是对象, obj[key])toList(obj[key], li…

jQuery数组对象转javascript数组

当我们在前端开发中&#xff0c;使用了jQuery时&#xff0c;我们通常通过$(".box-item")的方式获取的是一个jQuery对象是一个类数组对象&#xff0c;当我们需要向后台传输的数据中&#xff0c;使用的是javascript数组&#xff0c;或者有时候&#xff0c;我们需要将jQ…

js 三维数组转对象数组 二维数组转对象数组

1. 三维数组转对象数组 输出&#xff1a; 代码如下&#xff1a; let dataArr [[[109.654541015625, 29.34387539941801],[110.467529296875, 59.34387539941801],[109.654541015625, 30.050076521698735],],]let list []dataArr[0].forEach(item > {let obj {lon: item[0…

如何在 JavaScript 中将数组转为对象

首先&#xff0c;我们需要明白对象具有键和值。 const object {key: value } 如果我们想把某个东西转换成一个对象&#xff0c;我们需要传递具有这两个要求的东西&#xff1a;键和值。 满足这些要求的参数有两种类型&#xff1a; 具有嵌套键值对的数组 Map 对象 数组 这是一个…

第二类斯特林数

概要&#xff1a; 第二类斯特林数表示将n个不同的元素分成m个集合的方案数。 代码 s[i][j]实现代码&#xff1a; const int mod1e97;//取模 LL s[N][N];//存放要求的第一类Stirling数 void init(){memset(s,0,sizeof(s));s[1][1]1;for(int i2;i<N-1;i){for(int j1;j<…

斯特林数

斯特林数分为第一类斯特林数和第二类斯特林数&#xff0c;第一类斯特林数分为有符号斯特林数和无符号斯特林数&#xff1b; 1.什么是圆排列&#xff1f; 圆排列是把n个数中拿出k个数组成一个圆的种类数&#xff0c;则这里组成m个圆排列的意思是组成m个不同的圆的种类数&…

斯特林数(Stirling)

第一类斯特林数 第一类斯特林数表示的是将n个不同元素分成k个不同的环的方案数。两个环不相同当且仅当这两个环不能通过旋转得到。记作s(n,k). s(n,k)的递推公式&#xff1a; s(n,k)(n-1)*s(n-1,k)s(n-1,k-1) ,1<k<n 边界条件&#xff1a;s(n,0)0 ,n>1 s(n,n)1 ,n…

斯特林数(Siteling_Number)

一、基本概念 斯特林数出现在许多组合枚举问题中. 第一类斯特林数 StirlingS1[n,m]&#xff0c; 给出恰包含 m 个圈的 n 个元素 的排列数目. 斯特林数满足母函数关系 . 注意某些 的定义与 Mathematica 中的不同&#xff0c;差别在于因子 . 第二类斯特林数 StirlingS2[n,m]给…

斯特林数(数论)

斯特林数&#xff1a;stirling 概念&#xff1a; 1、第一类斯特林数&#xff1a;把1~n排列成k个非空循环的方案数&#xff0c;用小写s(n,k)或[n k]表示 2、第二类斯特林数&#xff1a;将1~n排成k个非空集合的方案数&#xff0c;用大写S(n,k)或{n,k}表示 第一类斯特林数&…

组合数学 —— 斯特林数(Stirling)

【第一类斯特林数】 1.定理 第一类斯特林数 S1(n,m) 表示的是将 n 个不同元素构成 m 个圆排列的数目。 2.递推式 设人被标上1,2,.....p&#xff0c;则将这 p 个人排成 m 个圆有两种情况&#xff1a; 在一个圆圈里只有标号为 p 的人自己&#xff0c;排法有 S1(n-1,m-1) 个。…

Linux Debian11创建新用户和删除用户

一、 Debian 创建 新用户 1.创建新用户 首先&#xff0c;要创建用户&#xff0c;当前用户必须是 root 用户或者 sudo 用户。 使用下面adduser 命令创建一个用户名为test的sudo用户&#xff0c;按照提示输入密码&#xff0c;使用 adduser 命令&#xff0c;还会创建用户的主目…

Linux中创建新用户,设置ID与密码

如&#xff1a;新建用户admin&#xff0c;指定在/root家目录下&#xff0c;并指定用户id为6666&#xff0c;设置密码&#xff1a;admin123 添加用户 add&#xff1a;用于创建新的系统用户 语法&#xff1a;useradd[选项] 用户名 -d 指定用户的家目录&#xff08;默认用户名目录…

Linux手工创建新用户

准备工作&#xff08;配置流程的理解&#xff09; Linux中useradd命令即一系列文件操作的结合体&#xff0c;所以我们可以通过查看useradd命令来确认我们手工创建新用户需要完成的文件配置 找到man useradd中涉及的文件部分 对于手工创建用户有用的文件&#xff1a; /etc/pas…

linux创建/删除新用户

为了完成本关任务&#xff0c;你需要掌握如下知识&#xff1a; Linux创建用户命令Linux删除用户命令 Linux创建用户命令 Linux中使用useradd命令来创建一个新用户。 命令格式格式&#xff1a; useradd [命令参数] 参数 常见命令参数&#xff1a; -d<登入目录>&…

Linux如何创建一个新的用户?

1. useradd -d /root/admin admin -u 6666 把一个用户名为admin&#xff0c;id为6666的新用户创建在指定 /root 家目录下。 2. passwd admin 给新用户admin设置密码。