JavaSE-自定义队列+两栈实现队列+两队列实现栈

2023-05-16

1.顺序队列实现

与栈一样,队列也是一种操作受限制的线性表,但与栈不同的是,栈是后进先出,队列的特点是先进先出。

实现与栈类似,队列有一个队头指针和一个队尾指针,入队的时候利用队尾指针进行尾插,出队的时候利用队头指针,把队头指针对应数组中的元素赋值为null,防止内存溢出。

class OrderQueue<T>{
    private int header; //队头位置
    private int tail; //队尾位置
    private int size; //有效元素
    private T[] queueArrays;
    private static final int defaultcapacity = 5;

    public OrderQueue(){
        this(defaultcapacity);
    }

    public OrderQueue(int capacity){
        this.queueArrays = (T[])new Object[capacity];
    }

    //入队
    public boolean enqueue(T value){
        //判满
        if(isFull()){
            //扩容
            if(size == queueArrays.length){
                queueArrays = Arrays.copyOf(queueArrays, queueArrays.length*2);
            }else{
                System.arraycopy(queueArrays, header, queueArrays, 0, size);
            }
        }
        queueArrays[tail++] = value;
        size++;
        return true;
    }

    public boolean isFull(){
        return tail == queueArrays.length;
    }

    //出队
    public T dequeue(){
        if(isEmpty()){
            throw new UnsupportedOperationException("the queue has been empty");
        }
        T result = queueArrays[header];
        queueArrays[header++] = null;
        size--;
        return result;
    }

    public boolean isEmpty(){
        return size == 0;
    }

    public void show(){
        for(int i=header; i<tail; i++){
            System.out.print(queueArrays[i]+" ");
        }
        System.out.println();
    }
}

2. 循环队列实现

循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。图中有两个名义上的队头head队尾tail指向0和7。

对于循环队列存在一种特殊现象:假溢出。设队头指针为head,队尾指针是tail,约定head指向队头元素的前一位置,tail指向队尾元素。当head等于-1时队空,tail等于m-1时为队满。由于队列的性质(“删除”在队头而“插入”在队尾),所以当队尾指针tail等于m-1时,若head不等于-1,则队列中仍有空闲单元,所以队列并不是真满。这时若再有入队操作,会造成假“溢出”。

解决假溢出:

当添加一个元素时,(tail+1)%MAXSIZE;

当删除一个元素时,(head+1)%MAXSIZE;

当head=front的时候,队列可能是满,也可能是空。

  因为存在满和空两种情况,需要分别判断:

  :当队列添加元素到tail的下一个元素是head的时候,也就是转圈子要碰头了,就认为队列满了。(Q.tail+1)%MAXSIZE=Q.head

  :当队列删除元素到head=rear的时候,认为队列空了。Q.tail==Q.head,不一定为0

实现过程:

class LoopQueue<T>{
    private int header; //队头位置
    private int tail; //队尾位置
    private T[] queueArrays;
    private static final int defaultcapacity = 5;

    public LoopQueue(){
        this(defaultcapacity);
    }

    public LoopQueue(int capacity){
        this.queueArrays = (T[])new Object[capacity];
    }

    //入队
    public boolean enqueue(T value){
        //判满
        if(isFull()){
            //扩容
            queueArrays = Arrays.copyOf(queueArrays, queueArrays.length*2);
        }
        queueArrays[tail] = value;
        tail = (tail+1) % queueArrays.length;
        return true;
    }

    public boolean isFull(){
        return (tail+1)%queueArrays.length == header;
    }

    //出队
    public T dequeue(){
        if(isEmpty()){
            throw new UnsupportedOperationException("the queue has been empty");
        }
        T result = queueArrays[header];
        queueArrays[header] = null;
        header = (header+1) % queueArrays.length;
        return result;
    }

    public boolean isEmpty(){
        return header == tail;
    }

    public void show(){
        for(int i=header; i<tail; i=(i+1)%queueArrays.length){
            System.out.print(queueArrays[i]+" ");
        }
        System.out.println();
    }
}

3. 两个栈实现队列的入队出队

思路:首先定义两个栈,称为栈1和栈2,在进行入队操作的时候直接将元素入栈1,出栈的时候出栈2的栈顶,如果栈2为空的话就将栈1的元素入到栈2中,再进行出栈,两次入栈操作就能完成队列的先进先出操作,如果两个栈都为空的话就抛出异常。

    public static Stack<Integer> stack1 = new Stack<>();
    public static Stack<Integer> stack2 = new Stack<>();
    public static void pushQueue(int value){
        stack1.push(value);
    }

    public static int popQueue(){
        if(stack1.isEmpty() && stack2.isEmpty()){
            throw new UnsupportedOperationException("the stack has been empty");
        }
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }

4.两个队列实现栈的入栈出栈

思路:先定义两个队列,称为队1和队2,LinkedList类型是可以对两端进行操作的。入栈时,起初两个队列都为空,可以先将元素入队1,出队的时候将队1的元素用一个临时队列存储起来,将队中length-1个元素入到另一个临时队列,此时队列中还剩一个元素,对它进行出栈即可。

    public static Queue<Integer> queue1 = new LinkedList<>();
    public static Queue<Integer> queue2 = new LinkedList<>();
    public static void pushStack(int value){
        if(queue1.isEmpty() && queue2.isEmpty()){
            queue1.add(value);
        }else if(queue1.isEmpty()){
            queue2.add(value);
        }else{
            queue1.add(value);
        }
    }

    public static int popStack(){
        //popQueue是当前的数据队列
        Queue<Integer> popQueue = queue1.isEmpty() ? queue2 : queue1;
        //pushQueue是当前的辅助队列
        Queue<Integer> pushQueue = queue1.isEmpty() ? queue1 : queue2;

        while(popQueue.size() > 1){
            pushQueue.add(popQueue.remove());
        }
        return popQueue.remove();
    }

 

 

 

 

 

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

JavaSE-自定义队列+两栈实现队列+两队列实现栈 的相关文章

  • 【JavaSE系列】第八话 —— 继承和它的边角料们

    导航小助手 思维导图 一 引出继承 二 继承的概念 三 继承的语法 四 父类成员访问 4 1 子类中访问父类的成员变量 4 2 子类访问父类的成员方法 五 super 关键字 5 1 super 成员变量 5 2 super 成员方法 5
  • Java异常(超详细!)

    1 什么是异常 java提供异常处理机制有什么用 什么是异常 程序执行过程中的不正常情况 异常的作用 增强程序的 健壮性 eg public class ExceptionTest01 public static void main Str
  • 【javaSE】 反射与反射的使用

    文章目录 反射的定义 反射的用途 反射基本信息 反射相关的类 Class类 反射机制的起源 Class类中的相关方法 反射示例 获得Class对象的三种方式 反射的使用 反射优点和缺点 反射重点总结 总结 反射的定义 Java的反射 ref
  • eclipse上配置JavaFX完整教程

    1 选择菜单栏Help中的Install New Software 2 点击Add添加安装JavaFx环境 name e fx clipse Location http download eclipse org efxclipse upda
  • 学编程太枯燥太难怎么办?

    大家好 我是老三 和大家分享一些我学编程的经历 那年二十 头发浓密如野狗 夏日炎炎 枯坐机房如木头 一根指头 颤颤巍巍如老叟 敲下了第一行 Hello World 开启了编程学习生涯 刚开始 参加的是学校的一个夏季编程训练营 起初是有学长学
  • JAVA接收JSON中的数组

    入参数据示例 respCode 0000 respMsg 请求成功 bizSeqNo 22022120001184432418054888526616 transTime 20220221180548 success true tokenA
  • 面向对象编程(概念)

    面向对象编程 概念 面向过程 面向对象 面向过程思想 1 步骤清晰简单 第一步做什么 第二步做什么 2 面对过程是和处理一些较为简单的题目 面向对象思想 1 物以类聚 分类的思维模式 思考问题首先会解决问题需要哪些分类 然后对这些分类进行单
  • Java 解析http返回的xml数据

    Java 解析http返回的xml数据 写成txt文件 需求 每小时抓取给定api接口返回的xml数据 把xml数据保存为XML文件 把xml数据转换txt文件格式数据 保存txt文件 文件名以yyyyMMddHH0000 txt和yyyy
  • 多态(polymorphic)

    目录 1 多态的基本介绍 2 多态实现条件 3 重写 重写的介绍 重写和重载的区别 动 静态绑定机制 5 向上转型和向下转型 向上转型 向上转型的特点 总结 向下转型 多态的优缺点 多态是Java三大基本特征中最抽象也是最重要的特征 多态是
  • 【Java编程】图书管理系统

    图书管理系统 我们用一个列表存放书籍信息 private static List
  • 包装类自动装箱和拆箱原理

    包装类的自动装箱和自动拆箱 包装类的自动装箱和拆箱是JDK1 5的新特性 一 首先 了解自动装箱的过程 有两种自动装箱过程 第一种 128 127 之内 调用相应包装类的valueOf 例如 Integer i 12 Integer a 2
  • 什么?到现在你还不知道什么是 访问修饰限定符吗?

    导航小助手 前言 一 public 访问修饰限定符 二 private 访问修饰限定符 三 default 访问修饰限定符 3 1 包的概念 3 2 导入包中的类 3 3 自定义包 3 4 包访问权限 3 5 常见的包 四 protecte
  • Java字符串分析器

    package StruingTokenizer import java util StringTokenizer public class StringTokenizer public static void main String ar
  • JAVA高级类特性(一)

    一 继承性 1 继承的使用 权限修饰符 class A extends B 2 子类 A 父类 基类 SuperClass B 3 子类继承父类后 父类中声明的属性 方法 子类都可以获取到 明确 当父类中有私有的属性或方法时 子类同样可以获
  • 树型结构——二叉数

    之前就说过我们的数据结构分为两种 分别是线性结构和非线性结构 我们今天要学的第一种线性结构就是树型结构 1 树型结构 树型结构并非我们熟悉的重点 所以在这里只做了解 概念 树是一种非线性的数据结构 它是由n n gt 0 个有限结点组成一个
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • String类详解

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore
  • Java的多态特性

    学习笔记 多态 简单说 就是一个对象对应着不同类型 多态在代码中的体现 父类或者接口的引用指向其子类的对象 多态的好处 提高可维护性 由多态前提所保证 提高了代码的扩展性 多态的弊端 无法直接访问子类特有的成员 也就是说前期定义的内容不能使
  • java实现简单的生成52张牌、三个人洗牌、码牌算法

    定义一个Pocker类 用于定义牌类 package demo public class Poker private String suit 花色 private int rank 数字 构造函数 public Poker String s
  • java 使用匿名内部类的方式创建线程并设置和获取线程名字

    有些方法需要传入接口的实例或者抽象类的实例对象 比如Thread有一个构造方法 Thread Runnable target 这时可以可以自定义类实现Runnable接口 重写接口中的方法 将自定义类的对象传入构造方法中 也可以使用匿名内部

随机推荐

  • 视觉SLAM学习--基础篇(SLAM框架及相机模型)

    一 例子 如上图的小萝卜机器人 xff0c 要使其具有自主运动能力至少需要两个条件 xff1a 1 我在什么地方 xff1f 定位 2 周围环境是什么样 xff1f 建图 因此它既需要知道自身的状态 位置 xff0c 也要了解所在的环境 地
  • Linux各类软件安装配置问题记录

    1 Ubuntu侧边栏和顶部栏消失不见 解决方法 xff1a 鼠标右键或者快捷键打开终端输入命令 dconf reset f org compiz 输入命令 setsid unity 一般到这一步侧边栏就会出现了 xff0c 如果没有出现就
  • 代码模拟确定有限自动机(DFA)执行过程

    一个确定有限自动机 xff08 DFA xff09 M是一个五元组 xff1a M 61 xff08 K xff0c xff0c f xff0c S xff0c Z xff09 其中 K是一个有穷集 xff0c 它的每个元素称为一个状态 x
  • 视觉SLAM-Eigen学习实践

    1 Eigen库介绍 Eigen 是一个 C 43 43 开源线性代数库 它提供了快速的有关矩阵的线性代数运算 xff0c 还包括解方程等功能 可以通过sudo apt install libeigen3 dev命令进行安装 xff0c 也
  • 苹果手机存储空间(或称为内存)满了导致黑屏转圈白苹果

    没刷机 xff0c 啥也没干 xff0c 发现把SIM卡拔了再开机就好了 xff0c 然后赶紧去卸载一些软件腾出空间
  • Arrays的toString方法和deepToString方法比较

    因为打印二维数组时用错了方法 xff0c 一般是用Arrays deppToString或者遍历使用toString xff0c 我直接用Arrays toString去打印了二维数组 xff0c 没有打印出正常二维数组的内容 xff0c
  • JavaSE-类与对象+单例模式

    1 类与对象的引用 概念 xff1a 如果一个变量的类型是类类型 xff0c 而非基本类型 xff0c 那么该变量又叫做引用 new testClass 该操作表示创建了一个testClass对象 xff0c 但没有办法访问这个对象 tes
  • JavaSE-类与对象-ATM自主操作系统实现

    学完类与对象的练习小作业 xff0c 主要有三个类 xff1a 银行卡类包含银行卡的相关信息如卡号 xff0c 密码 xff0c 姓名 xff0c 余额 xff1b 银行类中主要定义了一个银行卡数组 xff0c 用来存储当前用户的银行卡信息
  • JavaSE-基于回溯法用类+栈实现迷宫问题

    目录 1 问题描述 2 自定义类栈 3 结点类 4 操作类 5 函数讲解 6 测试类及结果 1 问题描述 输入迷宫大小 xff0c 以及路径 xff0c 0表示可走路径 xff0c 1表示死路 xff0c 从输入矩阵的左上角起点到右下角终口
  • Leetcode-234,844,19

    234 回文链表 请判断一个链表是否为回文链表 示例 1 输入 1 gt 2 输出 false 示例 2 输入 1 gt 2 gt 2 gt 1 输出 true 思路 xff1a 本想将链表逆置然后进行比较 xff0c 后来想了想用栈去做更
  • JavaSE-回溯+自定义类栈实现Puzzle问题

    Puzzle问题描述 如图有一个一维数组 xff0c 上面的数字表示可以移动的步数 xff0c 每个结点都有左右两个方向可以移动 xff0c 例如第一个结点4 xff0c 它只能往右移动4格到3的位置 xff0c 而3左右都可以移动 xff
  • JavaSE-泛型类、接口、方法、擦除机制

    1 泛型定义 泛型是JavaSE 1 5的新特性 xff0c 本质是参数化类型 xff0c 也就是所操作的数据类型被指定为一个参数 xff0c 将类型由原来的具体的参数类型化 xff0c 类似于方法中的变量参数 xff0c 此时类型也定义成
  • JavaSE-十分钟写个五子棋

    1 设计说明 1 1 简介 其实很久之前就写过五子棋 xff0c 当时拿AWT写的界面 xff0c 后面通过socket通信实现了联机对战操作 xff0c 当时写五子棋写的可费劲了 xff0c 现在又要写一次五子棋 xff0c 不过是简单版
  • JavaSE-类加载过程及反射

    目录 一 类加载过程 1 装载阶段 1 1执行过程 1 2 类加载器 1 3 双亲委派模型 1 4 类加载时机 2 链接阶段 2 1验证阶段 2 2准备阶段 2 3解析阶段 3 初始化阶段 二 反射 1 定义 2 用途 3 步骤 4 代码实
  • STM32F407-基于AD7606进行多路数据采集

    1 原理图 2 管脚定义 2 1 OS2 OS1 OS0 查阅数据手册 这三个管脚组合控制过采样模式 000 表示无过采样 xff0c 最大 200Ksps 采样速率 001 表示 2 倍过采样 xff0c 也就是硬件内部采集 2 个样本求
  • caffeine 与 reactor mono 一起使用产生的缓存错误问题

    现象 与reactor mono一起使用 xff0c 发现get key时 xff0c 返回的一直都是抛出的错误信息 xff0c 没有预期中的如果cache loader 返回null 或 错误时 xff0c caffeine自动剔除key
  • EBYTE E103-W02 WIFI模块配置总结(TCP+UDP+HTTP+云透传)

    目录 1 硬件配置 1 1 原理图 1 2 管脚配置 2 AT指令集 3 AP模式配置 3 1AP介绍 3 2 AP配置TCP通信 3 3 AP配置UDP通信 4 STA模式配置 4 1STA介绍 4 2配置过程 4 3网页配置 5 基于亿
  • JavaSE-自定义单链表

    目录 1 自定义链表实现 2 基础操作 2 1 链表打印操作 2 2 链表逆序打印 2 3 链表逆置 3 进阶操作 3 1查找倒数第K个结点 3 2 不允许遍历链表 xff0c 在pos结点之前插入 3 3两个链表相交 xff0c 输出相交
  • SRGAN实现超分辨率图像重建之模型复现

    1 论文介绍 1 1简介 论文名称 Photo Realistic Single Image Super Resolution Using a Generative Adversarial Ledig C Theis L Huszar F
  • JavaSE-自定义队列+两栈实现队列+两队列实现栈

    1 顺序队列实现 与栈一样 xff0c 队列也是一种操作受限制的线性表 xff0c 但与栈不同的是 xff0c 栈是后进先出 xff0c 队列的特点是先进先出 实现与栈类似 xff0c 队列有一个队头指针和一个队尾指针 xff0c 入队的时