生活如果真能像队列一样的话

生活如果真能像队列一样,那该多好啊。
——————————————————————————————————————————

背包,队列

可以先看他们的API:都含有一个无参构造函数,添加单个元素的方法,测试集合是否为空的方法和返回集合大小的方法。而Stack和Queue有能删除集合的特定元素的方法。

它们具有泛型迭代的特性。

泛型的使用,可以用它们存储任意类型的数据。
如:Stack , 用Item替换任意数据类型

Stack<String> stack = new Stack<String>();

而类型参数必须被实例化为引用类型。而java具有自动装箱和自动拆箱的机制,可以在引用类型和对应的原始数据类型之间转换。

Stack<Integer> stack = new Stack<Integer>();
stack.push(17);  //自动装箱 (int 转换为 Integer)
int i = stack.pop(); //自动拆箱 (Integer 转换为 int)

如果集合可迭代,可以使用如foreach循环来逐个访问集合中的元素,无需手动管理索引或遍历位置,这样可以简化代码实现。

Queue<String> queue = new LinkedList<>();
// 使用 foreach 循环来遍历 Queue
for (String element : queue) {System.out.println(element);
}

背包

特点:

  • 支持删除元素和遍历操作
  • 收集元素并迭代遍历所有收集到的元素
  • 迭代的顺序不确定(无序)且与用例无关
  • 主要用于统计计算,去重,求平均值或者样本标准差之类的场景

就理解成一个背包即可,里面各种球,一次放进去一个球,或者一次从里面找自己想要的具有某种特点的球。

Bag<Double> numbers = new Bag<Double>();
while (!StdIn.isEpty()) numbers.add(StdIn.readDouble());
int N = number.size(); // 背包的元素数量double sum = 0.0
for (double x : number)sum += x;
double mean = sum/N;sum = 0.0;
for(double x : number)sum += (x - mean)*(x- mean);
double std = Math.sqrt(sum/(N-1));

队列(queue)

先进先出队列是一种基于先进先出(FIFO) 策略的集合类型。

使用场景很常见,尤其是排队,打印机等待打印或者是计算机某些软件等待处理的任务。

因为是服务性的策略,所以主打一个公平,先到先得,等的越久越先服务。

Queue<Integer> queue = new Queue<Integer>();
// Enqueue 操作  可以通过add()或offer()方法实现
queue.add("A");
queue.add("B");
queue.offer("C");// dequeue:从队列的头部移除并返回一个元素,可以使用remove()或poll()方法来实现
String dequeuedElement = queue.remove();
System.out.println("Dequeued element: " + dequeuedElement);

队列是一个有序列表,可以用数组或是链表来实现。

数组模拟队列思路

  • 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队 列的最大容量。
  • 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标, front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如图所示:

在这里插入图片描述

准备工作思路:

  1. 将front和rear初始化为-1 , 为了表示队列为空的状态 (当队列中添加第一个元素时,front和rear都会更新为0,表示队列中有一个元素)

  2. 当 front == rear 则代表队列为空

  3. 当 rear == maxSize - 1 则代表队列为满

class ArrayQueue {
private int maxSize; // 表示数组的最大容量
private int front; // 队列头
private int rear; // 队列尾
private int[] arr; // 该数据用于存放数据, 模拟队列// 创建队列的构造器
public ArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];front = -1; // 指向队列头部,分析出 front 是指向队列头的前一个位置.rear = -1; // 指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
}// 判断队列是否满   (队列尾指向数组的最大索引)
public boolean isFull() {return rear == maxSize - 1;
}// 判断队列是否为空   (初始时,两指针都为-1,指向同一个位置)
public boolean isEmpty() {return rear == front;
}

存入数据思路分析

1.添加元素时,判断队列是不是满的。若不是,则头指针不动,用于元素出队列,将尾指针后移:rear+1

2.再将数据存入 rear 所指的数组元素中

// 添加数据到队列
public void addQueue(int n) {
// 判断队列是否满if (isFull()) {System.out.println("队列满,不能加入数据~");return;}rear++; // 让 rear 后移arr[rear] = n;
}

出队列(获取队列的数据)代码

public int getQueue() {
// 判断队列是否空if (isEmpty()) {// 通过抛出异常throw new RuntimeException("队列空,不能取数据");}front++; // front 后移 满足先进先出原则。return arr[front];
}

显示队列中的所有数据 代码:

public void showQueue() {// 遍历if (isEmpty()) {System.out.println("队列空的,没有数据~~");return;}for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d]=%d\n", i, arr[i]);}
}

显示队列的头数据 代码:

public int headQueue() {if (isEmpty()) {throw new RuntimeException("队列空的,没有数据~~");}return arr[front + 1];}
}

对于这个代码所模拟的队列进行问题分析及方案优化:

  • 问题:目前数组使用一次就不能用,没有出队列的功能,则没有达到复用的效果。且如果队列尾部的空间已满,而队列头部仍有空间,此时无法再添加元素
  • 优化方案:将这个数组使用算法,改进成一个环形的队列 通过取模(%)变成循环

数组模拟环形队列

​ 对前面的数组模拟队列进行优化,实现可以复用。成为是一个环形的循环队列。(通过取模的方式来实现即可)

分析说明:

  1. 因为是环形结构,满了会回头。所以当尾索引的下一个为头索引时,表示队列满了。因此将队列容量空出一个作为约定。通过这个约定可以得出, (rear + 1) % maxSize == front,代表队列满了。

  2. rear == front 则代表队列为空

    当你定义了1个长度为5的队列,已经有了4个元素。这个时候头指针指着第一个数字,尾指针值向

    具体思路如下:

    1. 将front指向队列的第一个元素,即front=0

    2. 将rear指向队列最后一个元素的后一个位置,即rear=0。(这里需要注意,rear指向的位置实际上是不存储数据的,只是为了区分队列空和满的情况,因此需要浪费一个位置

      在这里插入图片描述

        这里比如当你定义了1个长度为5的队列,已经有了4个元素。这个时候头指针指着第一个元素,尾指针值向第4个元素后面的位置。这时候你再加一个元素的话,那尾指针就指回了第一个位置,这样子就出现了rear == front。那你就没办法确定到底是队列满了还是队列空了。因此采用(rear + 1) % maxSize == front就表示队列满了,此时rear指向的位置实际上是不存储数据的。
      
      • 在网上找到的其他思路:新增一个容量 capacity 字段,并进行维护,当 capacity=size 表示队列已满。维护一个标记,或者当 头指针=尾指针 时同步判断当前位置是否有元素来判断当前是队空还是队满。
        
      • 	现在使用的方法会浪费一个空间;而新增容量字段需要维护,而标记的方法队列空和队列满的时候需要判断是那种情况,影响性能。一般使用浪费一个空间的方法,用空间换时间。
        
    3. 在判断队列是否时,尾指针的下一个位置会等于头指针的位置。所以使用**(rear + 1) % maxSize == front**条件,当rear和front相邻且都指向有数据的位置时,队列为满。

      public boolean isFull() {return (rear + 1) % maxSize == front;
      }
    4. 在判断队列是否为时,使用rear == front的条件,当队列中没有元素时,front和rear都指向同一个位置。

      public boolean isEmpty() {return rear == front;
      }
      
    5. 计算队列中有效数据元素的个数时,使用**(rear + maxSize - front) % maxSize**的公式,由于队列是循环的,所以队列的尾部可能在数组的起始位置之前。

      计算出队列尾指针rear到队列头指针front的距离,并进行模运算,得到实际的元素个数。

添加数据到队列

public void addQueue(int n) {// 判断队列是否满if (isFull()) {System.out.println("队列满,不能加入数据~");return;}//直接将数据加入arr[rear] = n;//将 rear 后移, 这里必须考虑取模!rear = (rear + 1) % maxSize;
}

获取队列的数据, 出队列

public int getQueue() {// 判断队列是否空if (isEmpty()) {// 通过抛出异常throw new RuntimeException("队列空,不能取数据");}// 这里需要分析出 front 是指向队列的第一个元素// 1. 先把 front 对应的值保留到一个临时变量// 2. 然后将 front 后移, 考虑取模!// 3. 将临时保存的变量返回int value = arr[front];front = (front + 1) % maxSize;  return value;
}

显示队列的所有数据

public void showQueue() {// 遍历if (isEmpty()) {System.out.println("队列空的,没有数据~~");return;}for (int i = front; i < front + size() ; i++) {// 使用 i % maxSize 的目的是确保索引值在循环队列的有效范围内
//假设队列的最大大小为 5,且队列起始位置front是2,不取模的话,那就超出了队列范围,应该回到队列的开头,则需要取模。System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize])}
}// 求出当前队列有效数据的个数
public int size() {// rear = 2// front = 1// maxSize = 3return (rear + maxSize - front) % maxSize;
}

显示队列的头数据

public int headQueue() {// 判断if (isEmpty()) {throw new RuntimeException("队列空的,没有数据~~");}return arr[front];}
}

————————————————————————————————————
那这样子是不是就有机会了

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

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

相关文章

php项目从宝塔面板切换转到phpstudy小皮面板

宝塔面板转phpstudy面板 版本 宝塔面板8.0.1 phpstudy面板8.1.1.3 步骤 1、宝塔面板,找到项目文件夹,打包、下载到本地、解压 2、本地windows系统安装phpstudy面板,选择尽可能一样的配置 比如宝塔php7.4.33,可能phpstudy面板只有php7.4.3,也行 大环境一定要一致,比如…

力扣算法练习BM46—最小的K个数

题目 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&#xff0c;数组中每个数的大小0≤val≤1000 要…

linux signal 机制

ref&#xff1a; Linux操作系统学习笔记&#xff08;十六&#xff09;进程间通信之信号 | Ty-Chens Home https://www.cnblogs.com/renxinyuan/p/3867593.html 当执行kill -9 PID时系统发生了什么 -

Codeforces Round 910 (Div. 2) D. Absolute Beauty

D. Absolute Beauty 有两个长度为 n n n 的整数数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ 和 b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1​,b2​,…,bn​ 。他将数组 b b b 的美丽值定义为 ∑ i 1 n ∣ a i − b i ∣ . \sum_{i1}^{n} |a_i - b…

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

JDK命令使用总结

目录 javacjava javac 将源码(*.java)编译成字节码(*.class) javac HelloWorld.javajava 运行字节码(*.class) 不能加后缀名 java HelloWorld直接运行单文件源码(*.java) Java11以上才支持 java HelloWorld.java

ROSNS3(一)

https://github.com/malintha/rosns3 第一步&#xff1a;clone和构建rosns3客户端 第二步&#xff1a;运行 最详细的ubuntu 安装 docker教程 - 知乎 1. unable to find source space /home/muta/src 解决方法&#xff1a; 将副将将碰到的bug&#xff0c;解决方法_#include &…

【C++ Primer Plus学习记录】递增运算符(++)和递减运算符(--)

递增运算符&#xff08;&#xff09;和递减运算符&#xff08;--&#xff09;&#xff1a;前缀版本位于操作数前面&#xff0c;如x&#xff1b;后缀版本位于操作数后面&#xff0c;如x。两个版本对操作数的影响是一样的&#xff0c;但是影响的时间不同。这就像吃饭前买单和吃饭…

Python从零开始快速搭建一个语音对话机器人

文章目录 01-初心缘由02-准备工作03-语音机器人的搭建思路04-语音生成音频文件05-音频文件转文字STT06-与图灵机器人对话07-文字转语音08-语音对话机器人的完整代码09-结束语10-有问必答关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学…

SSH连接远程服务器报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解决方法

一.错误描述 报错信息里提示了路径信息/root/.ssh/known_hosts:20 二.解决方案 方法一 输入以下指令&#xff1a; ssh-keygen -R XXX&#xff08;需要连接远程服务器的ip&#xff09; 按照我的例子ip:10.165.7.136&#xff0c;会返回以下信息: 重新尝试连接&#xff1a; 输…

C++学习 --set

目录 1&#xff0c; 什么是set 2&#xff0c; 创建set 2-1&#xff0c; 标准数据类型 2-2&#xff0c; 自定义数据类型 2-3&#xff0c; 其他创建方式 3&#xff0c; 操作set 3-1&#xff0c; 赋值 3-2&#xff0c; 添加元素&#xff08;insert&#xff09; 3-2-1&…

MySQL的乐观锁和悲观锁

1、乐观锁&#xff1a; 乐观锁在操作数据的时候&#xff0c;是保持一种乐观的状态&#xff0c;认为别的线程是不会同时修改数据的&#xff0c;所以是不会上锁的&#xff0c;但是在更新的时候&#xff0c;会判断一下在这个期间内是否有别的线程修改过数据。 主要的流程&#x…

规划类3d全景线上云展馆帮助企业轻松拓展海外市场

科技3D线上云展馆作为一种基于VR虚拟现实和互联网技术的新一代展览平台。可以在线上虚拟空间中模拟真实的展馆&#xff0c;让观众无需亲自到场&#xff0c;即可获得沉浸式的参观体验。通过这个展馆&#xff0c;您可以充分、全面、立体展示您的产品、服务以及各种创意作品&#…

python运算符重载之成员关系和属性运算

1 python运算符重载之成员关系和属性运算 1.1 重载成员关系运算符 1.1.1 contains,iter,getitem python使用成员关系运算符in时&#xff0c; 按优先级调用方法&#xff1a;contains>iter>getitem&#xff1b; class MyIters:def __init__(self,value):self.datavalu…

2023年【安全生产监管人员】考试题及安全生产监管人员找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题参考答案及安全生产监管人员考试试题解析是安全生产模拟考试一点通题库老师及安全生产监管人员操作证已考过的学员汇总&#xff0c;相对有效帮助安全生产监管人员找解析学员顺利通过考试。 1、…

【树莓派】Camera Module 使用

工具 RPI4RPI Camera Module 2 硬件安装 直接插到板子的相机带子插口上即可 使用前提 libcamera-hello运行这个命令能够成功&#xff0c;否则需要装相应的包 在 RPI4 上测试 libcamera-jpeg -o 00001.jpg -t 2000 --width 640 --height 480t 表示程序运行&#xff08;预…

SA8255 Q+A android 登录QNX

需要工具busybox 130|gen4_gvm:/ # cd /data/ gen4_gvm:/data # ./busybox telnet 192.168.1.1Entering character mode Escape character is ^].QNX Neutrino (localhost) (ttyp0)login: root No home directory. Logging in with home "/". # 用户名&#xff1a…

数据结构-栈的实现

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

Matlab群体智能优化算法之海象优化算法(WO)

文章目录 一、灵感来源二、算法的初始化三、GTO的数学模型Phase1&#xff1a;危险信号和安全信号Phase2&#xff1a;迁移&#xff08;探索&#xff09;Phase3&#xff1a;繁殖&#xff08;开发&#xff09; 四、流程图五、伪代码六、算法复杂度七、WO搜索示意图八、实验分析和结…