Java数组实现循环队列的两种方法

2023-11-10

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Victor_Cindy1/article/details/46604575

用java实现循环队列的方法:

1、增加一个属性size用来记录目前的元素个数。目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满。

2、数组中只存储数组大小-1个元素,保证rear转一圈之后不会和head相等,也就是队列满的时候,rear+1=head,中间刚好空一个元素。

      当rear=head的时候,一定是队列空了。

队列(Queue)两端允许操作的类型不一样:

可以进行删除的一端称为队头,这种操作也叫出队dequeue;

可以进行插入的一端称为队尾,这种操作也叫入队enqueue。

队列的示意图

实现队列时,要注意的是假溢出现象,如上图的最后一幅图。

如图所示的假溢出现象

解决办法:使用链式存储,这显然可以。在顺序存储时,我们常见的解决办法是把它首尾相接,构成循环队列,这可以充分利用队列的存储空间。

循环队列示意图:

在上图中,front指向队列中第一个元素,rear指向队列队尾的下一个位置。

但依然存在一个问题:当front和rear指向同一个位置时,这代表的是队空还是队满呢?大家可以想象下这种情景。

解决这种问题的常见做法是这样的:

使用一标记,用以区分这种易混淆的情形。

牺牲一个元素空间。当front和rear相等时,为空;当rear的下一个位置是front时,为满。

如下图:

下面我们给出循环队列,并采用第二种方式,即牺牲一个元素空间来区分队空和队满的代码.

几个重点:

1、front指向队头,rear指向队尾的下一个位置。

2、队为空的判断:front==rear;队为满的判断:(rear+1)%MAXSIZE==front。

 

import java.io.*;
    public class QueueArray {   
    Object[] a; //对象数组,队列最多存储a.length-1个对象   
    int front;  //队首下标   
    int rear;   //队尾下标   
    public QueueArray(){   
        this(10); //调用其它构造方法   
    }   
    public QueueArray(int size){   
        a = new Object[size];   
        front = 0;   
        rear =0;   
    }   
    /**  
     * 将一个对象追加到队列尾部  
     * @param obj 对象  
     * @return 队列满时返回false,否则返回true  
     */  
    public boolean enqueue(Object obj){   
        if((rear+1)%a.length==front){   
            return false;   
        }   
        a[rear]=obj;   
        rear = (rear+1)%a.length;   
        return true;   
    }   
    /**  
     * 队列头部的第一个对象出队  
     * @return 出队的对象,队列空时返回null  
     */  
    public Object dequeue(){   
        if(rear==front){   
            return null;   
        }   
        Object obj = a[front];   
        front = (front+1)%a.length;   
        return obj;   
    }   
    public static void main(String[] args) {   
        QueueArray q = new QueueArray(4);   
        System.out.println(q.enqueue("张三"));   
        System.out.println(q.enqueue("李斯"));   
        System.out.println(q.enqueue("赵五"));   
        System.out.println(q.enqueue("王一"));//无法入队列,队列满   
        for(int i=0;i<4;i++){   
            System.out.println(q.dequeue());   
        }   
    }   
} 

 

 

 

https://blog.csdn.net/victor_cindy1/article/details/46604575

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

Java数组实现循环队列的两种方法 的相关文章

  • 作为颜色表示的值

    将值转换为颜色是众所周知的 我确实理解以下两种方法 在改变 RGB 颜色值来表示一个值 https stackoverflow com questions 1423925 changing rgb color values to repre
  • 更快的第二好 MST 算法?

    我正在为此苦苦挣扎 我们可以使用 Kruskal 算法或 Prim 算法得到 MST 对于 第二好的 MST 我可以 首先使用上述任一算法获取 MST 对于来自 MST 的最优边缘的每个 V 1 A 首先删除或标记边缘b 继续计算 MST
  • 使用 Chudnovsky 算法计算 pi 时出错 - Java

    我一直在尝试编写一个简单的程序来使用 Chudnovsky 算法计算 pi 但是我不断得到错误的值输出 我编写的最新代码如下并输出 9 6427156192980758374488232782187800865411623432530844
  • 是否有可能比 O(n log n) 更好地计算数字列表的中位数?

    我知道可以在 O n 中计算数字列表的平均值 但是中位数呢 有没有比排序 O n log n 和查找中间元素 或者如果列表中有偶数个项目则两个中间元素的平均值 更好的算法 是的 您可以在 O n 时间内 确定性地 完成此操作 http ww
  • 用于反恶意软件代码的类 Aho-Corasick 算法

    有没有类似的算法阿霍 科拉西克 http en wikipedia org wiki Aho E2 80 93Corasick string matching algorithm 它可以同时匹配一组模式并适用于反恶意软件比较 所有已知的商业
  • 求矩阵 (n x n) 的最小总和,在每一行和每一列中只选择一个

    这是与动态规划相关的另一个算法问题 问题是这样的 找到给定矩阵的最小总和 以便在每一行和每一列中选择一个 例如 3 4 2 8 9 1 7 9 5 最小的一个 4 1 7 我认为解决方案是网络流量 最大流量 最小切割 但我认为它不应该那么难
  • 以有效的方式找到最近点

    我在 2d 平面上有一个点 例如 x0 y0 和一组 n 点 x1 y1 xn yn 我想在 a 中找到距离 x0 y0 最近的点比尝试所有要点要好得多 有什么解决办法吗 我还应该说我的观点是这样排序的 bool less point a
  • 帮助我在 Python 中实现反向传播

    EDIT2 新的训练集 Inputs 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 0 1 0 0 0 1 0 1 0 1 0 2 0 1 0 3 0 1 0 4 0 2 0 0 0 2 0 1 0 2 0 2
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 如何将多个矩形打包为 2d 盒子俄罗斯方块样式

    我有许多不同宽度和高度的矩形 我有一个更大的矩形平台来放置它们 我想将它们包装在平台的一侧 以便它们在纵向 X 尺寸上展开 但将横向 Y 尺寸保持在最小限度 就是把它们像俄罗斯方块游戏一样放置 不能有重叠 但可以有间隙 有没有算法可以做到这
  • 许可证密钥模式检测? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这不是真实情况 请忽略您可能认为适用的法律问题 因为它们并不适用 假设我有一组 200 个已知的有效许可证密钥 用于假设的软件许可算法
  • 最近点对算法

    我目前正在致力于用 C 实现最接近的点对算法 也就是说 给定一个点列表 x y 找到具有最小欧氏距离的点对 我对此进行了研究 我对算法的理解如下 如果我错了 请纠正我 将点数组从中间拆分 递归地找到左半部分和右半部分距离最小的点对 按 y
  • 使用动态编程理解正则表达式字符串匹配

    我遇到了这个问题 要求您实现一个支持 的正则表达式匹配器 和 其中 匹配任何单个字符 匹配零个或多个前面的元素 isMatch aa a false isMatch aa aa true isMatch aaa aa false isMat
  • O(mn) 比 O((m+n)^2) 更好吗?

    算法的输入是m and n 我的算法的时间复杂度是O mn 我有一个时间复杂度为的基准算法O m n 我的实现在时间复杂度方面是否优于基准 许多评论者和回答者希望只考虑以下情况 m n或者至少当它们通过一个常数因子相关时 这不是它的工作原理
  • Java:使用indexOf方法根据另一个数组对数组进行排序

    我想根据另一个数组 索引 的排序顺序迭代两个数组 A B 在本例中为 10 34 32 21 String A a b c d String B e f g h int indexes 10 34 32 21 为这里的坏例子道歉 我已经更新
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi
  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要

随机推荐

  • nginx实现路由重定向功能 避免服务器出现 404 Not Found

    首先 到服务器上 vue react等项目路由的重定向已解决不了带后缀的访问 这个重定向需要 nginx 来实现 我们先执行 scp r 用户名 如果没设置过就是root 服务器公网地址 etc nginx nginx conf E 拷贝地
  • Java基础最新教程-小白到大神,从api层面到底层原理解抛

    JavaSe JDK JRE JVM是什么 JDK Java Development Kit JRE Java Runtime Environment JVM Java Virtual Machine Java跨平台核心是使用Jvm 在不同
  • Java基础学习之函数式编程Comsumer接口(JDK8)

    前言 从毕业到现在正好三年 高难度的项目做了不少 但是基础这个东西一段时间不接触就会忘得一干二净 话不多说 开始今天的学习 1 Consumer接口 接触过 消费者 生产者 模式的同学 肯定对这个单词不陌生 在java8函数式编程和lamb
  • mcd, lm, VS lx

    LED常识之 mcd lm w的关系 转载自 http 1198 vip blog 163 com blog static 202177117201211624535412 LED 亮度是指发光体 反光体 表面发光 反光 强弱的物理量 人眼
  • Zynq-LWIP上行传输大批量数据方法说明

    此篇是我在学习中做的归纳与总结 其中如果存在版权或知识错误或问题请直接联系我 欢迎留言 PS 本着知识共享的原则 此篇博客可以转载 但请标明出处 目录 1 项目简介 1 1 完成功能 1 1 使用工具 2 LWIP141 DMA上行传输数据
  • web前端学习笔记一

    一 VS Code快捷键 代码格式化 Shift Alt F 向上或向下移动一行 Alt Up或Alt Down 快速复制一行代码 Shift Alt Up或Shift Alt Down 快速替换 Ctrl H 二 标题标签 h1 定义最大
  • C语言 函数 上

    函数的定义 子程序 是一个大型程序中的某部分代码 由一个或多个语句块组成 它负责完成某项特定任务 相较于其他代码 具备相对的独立性 2 库函数 eg 打印函数 printf 字符串拷贝 strcpy 计算n的k次方 pow函数 3 自定义函
  • 前端面试题----第1天

    文章目录 HTML link和 import的区别 CSS 圣杯布局和双飞翼布局 JS 用递归算法实现 数组长度为5且元素的随机数在2 32间不重复的值 HTML link和 import的区别 1 link是HTML标签 import是c
  • 数据链路层以太网帧格式------理解MTU的定义和最大值(1500字节)

    在前面的文章中 我们讨论了IP的包格式 也说过TCP UDP的包格式 无论是TCP还是UDP 最终还是封装成了IP包 我们知道 IP包的最大程度为65535个字节 于是很多初学者会误解 以为这65535字节的IP包数据 是直接被数据链路层套
  • C基础知识总结(全)

    目录 第一个程序hello world说明 计算机中的数据存储 数值型数据的存储 非数值型数据的存储 词法符号 关键字 标识符 数据类型 数据类型的分类 整数类型 浮点类型 实型 小数 空类型 原码 反码 补码 常量 实型常量 字符常量 字
  • 动力节点Java实用小技能,手把手带你生成二维码

    随着互联网的快速发展 二维码逐渐成为了主流 日常生活已经离不开二维码了 它们变得越来越有用 从候车亭 产品包装 家装卖场 汽车到很多网站 都在自己的网页二维码 让人们快速找到它们 随着智能手机的用户量日益增长 二维码的使用正在呈指数上升 让
  • 485集线器

    485集线器ZLAN9480A是一款可通过一路RS485主口扩展出8路RS485从口的工业级隔离型8口RS485集线器 可以有效的实现RS485网络的中继 扩展与隔离 ZLAN9480A的主口端提供隔离型RS485 从口端扩展出8路隔离型R
  • C++基础入门(数据类型)

    数据类型 整型 sizeof关键字 实型 浮点数 字符型 转意字符 字符串 布尔类型 数据的输入 C 规定在创建一个变量或者常量时 必须要指定出相应的数据类型 否则无法给变量分配内存 整型 作用 整型变量表示的是整数类型的数据 C 中能够表
  • FreeSwitch中配置网关的方法

    在VOIP通信系统中 经常要用到网关 那么网关怎么和FreeSwitch在一起配合使用 有如下需求 有一虚拟运营商 即 SIP PROVIDER 提供拨打外线的功能 从该处购买一 SIP 账号 具体配置信息如下 用户名 user 密码 pa
  • 今天这个是mybatis与spring的整合

    今天这个是mybatis与spring的整合 依旧是一个查询的demo 首先是demo的结构 然后是我的jdbc properties jdbc driverClassName com mysql jdbc Driver jdbc url
  • 10-js逆向(数据加密)

    简单的加密 案例一 返来的数据加密 我们对他进行解密 拿到数据 看到返回的数据加密了 还是直接搜索 也可以直接搜索json parse 可以看到了数据在这个里面已经加密 所以下一步 找他的调用栈 可以看到数据被传在了这个里面 直接进行扣js
  • 基于Spark 的电影推荐系统

    基于大数据的电影推荐系统主要分为两部分 基于历史数据的离线处理和基于实时流的实时处理 离线处理是基于历史数据 实时处理是结合历史数据和实时采集的数据 运用协同过滤算法训练推荐模型 预测各个用户未看电影的评分 为用户推荐评分最高的前10部 系
  • Fiscov3.0.0-rc3底链+合约部署

    一 主机部署基础环境和配置 关闭防火墙和selinux sed s SELINUX enforcing SELINUX disabled g etc selinux config 预览 sed i s SELINUX enforcing S
  • Tracy 小笔记 Vue - 事件

    v on 事件监听 v on 绑定事件监听 缩写 v on 函数参数 在事件监听的时候 如果函数没有参数 那么调用的时候可以不加括号 也可以加括号 如 click add add 如果函数有参数 我们调用的时候加写空括号 那么这个参数的值是
  • Java数组实现循环队列的两种方法

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net Victor Cindy1 article details 46604575 用java实现循环队列的方法 1 增加一个属性size用来记录目前的元