数据结构与算法练习(二)数组模拟队列

news2024/11/24 10:37:51

文章目录

    • 1、队列
    • 2、数组实现队列
    • 3、数组实现循环队列


1、队列

队列是一个有序列表,可以用数组或链表来实现
遵循先入先出的原则
在队尾插入元素叫做入队,对头删除元素叫做出队。

2、数组实现队列

在这里插入图片描述思路:

  • 用front和rear记录队列前后的下标,初始化front=-1表示指向队列的头部(队列头的前一个位置),rear=-1指向队列尾(队列的最后一个数据)
  • 若尾指针rear小于队列的最大下标MaxSize-1,则rear+1尾指针往后移,若rear=MaxSize-1,则队列满。
  • 若出队,头指针front+1后移,若rear=front。队列为空。

代码实现:

package Que;
/*
 * 数组模拟队列
 * */
import java.util.Scanner;
public class ArrToQue {
    public static void main(String[] args) {
        //创建一个尺寸为5的队列
        Queue queue = new Queue(5);
        Scanner scanner = new Scanner(System.in);
        char key=' ';
        boolean loop=true;
        while (loop){
            System.out.println("d:显示队列");
            System.out.println("e:退出程序");
            System.out.println("a:添加数据到队列");
            System.out.println("b:从队列取出数据");
            System.out.println("c:查看队列头部数据");
            key=scanner.next().charAt(0); //获取用户输入的第一个字符
            switch (key){
                case 'a':
                    System.out.println("请输入一个数");
                    int value= scanner.nextInt();
                    queue.addQueue(value);
                    break;
                case 'b':
                    try{
                        int res = queue.delQue();
                        System.out.println("去除的数据为:"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());//低下抛出异常,这里捕捉异常信息
                    }
                    break;
                case 'c':
                    try{
                        int res = queue.headQue();
                        System.out.println("头数据为:"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());//低下抛出异常,这里捕捉异常信息
                    }
                    break;
                case 'd':
                        queue.showQue();
                        break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
    }
}

/*定义一个队列
* */
class Queue{
  int maxSize ;
  int front;
  int rear;
  int[] arr;
  //通过构造方法初始化
    public Queue(int maxSize) {
        this.maxSize = maxSize;
        this.front = -1;
        this.rear = -1;
        this.arr = new int[maxSize];
    }
    //判断队列是否为空
    public  boolean isNull(){
        //初始化都为-1为true,队列数据都取完front=rear=maxSize-1
        return front==rear;
    }
    //判断队列是否是满的
    public boolean isFull(){
        return rear==maxSize-1;
    }
    //队列中添加数据
    public void  addQueue(int data){
        //先判断队列是不是满的
        if(isFull()){
            //抛出运行时异常
            System.out.println("队列已经满了");
        }else {
            rear++;
            arr[rear]=data;
        }
    }
    //从队列中删除数据
    public  int delQue(){
        //首先判断队列是否为空
        if (isNull()){
            throw new RuntimeException("队列为空");
            //System.out.println("队列为空");
        }else {
            front++;
            return arr[front];//返回删除的数据
        }
    }
    //遍历队列
    public  void  showQue(){
        if (isNull()){
            System.out.println("队列为空");
        }else {
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }
    //显示队列的头数据
    public int headQue(){
        if (isNull()){
            throw  new RuntimeException("队列为空");
        }
        return arr[++front];//比如删除第一个数据front从-1变为0,此时头数据的指针应该指向第二个元素也就是下标为1数据
    }

}

这样实现队列有缺点:

队列只能使用一次(数组尺寸是固定的,添加满了就不能添加了
,只是指针发生改变),
不能达到复用的效果

3、数组实现循环队列

在这里插入图片描述实现思路:

  • front指向指向队列的第一个元素,初始化front=0, rear指向队列的最后一个元素的后一个位置,初始化rear=0,空出一个空间作为约定。

  • 当队列满时(rear+1)%maxSize=front

  • 当队列空时 front=rear

  • 入队rear=(rear+1)%maxSize

  • 出队front = (front+1)%maxSize

  • 队列中的有效数据:(rear + maxSize - front) %maxSize

    假设maxSize=3,实际上只能存储2个元素,初始化front=0,rear=0;
    入队一个元素
           添加:   front=0   arr[rear=0]   rear后移: rear=(rear+1)%maxSize=(0+1)%3=1
           继续添加:front=0   arr[rear=1]   rear后移:  (1+1)%3=2
           此时rear=(rear+1)%maxSize=(2+1)%3=0=front所以队列已经 满了
    出队一个元素
    		 出队:     front=0    front后移:  front = (front+1)%maxSize=(0+1)%3=1;
    		 继续出队:  front=1    front后移:  front = (front+1)%maxSize=(1+1)%3=2;
    		 此时front=(front+1)%maxSize=(2+1)%3=0=rear所以队列已经 空了
    队列中的有效数据:(rear + maxSize - front) %maxSize
          添加两个元素rear=2,删除一个front=1.有效数据为(2+3-1)%3=1   
                          0              2           (0+3-2)%3=1   
                          0              1           (0+3-1)%3=2
                          2              1           (2+3-1)%3=1
                          0              0           (0+3-0)%3=0
    
package Que;

import java.util.Scanner;

/*数组模拟循环队列
* */
public class ArrToCirQue {
    public static void main(String[] args) {
        //创建一个尺寸为5的队列
        CirQueue queue = new CirQueue(3);
        Scanner scanner = new Scanner(System.in);
        char key=' ';
        boolean loop=true;
        while (loop){
            System.out.println("d:显示队列");
            System.out.println("e:退出程序");
            System.out.println("a:添加数据到队列");
            System.out.println("b:从队列取出数据");
            System.out.println("c:查看队列头部数据");
            key=scanner.next().charAt(0); //获取用户输入的第一个字符
            switch (key){
                case 'a':
                    System.out.println("请输入一个数");
                    int value= scanner.nextInt();
                    queue.addQueue(value);
                    break;
                case 'b':
                    try{
                        int res = queue.delQue();
                        System.out.println("去除的数据为:"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());//低下抛出异常,这里捕捉异常信息
                    }
                    break;
                case 'c':
                    try{
                        int res = queue.headQue();
                        System.out.println("头数据为:"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());//低下抛出异常,这里捕捉异常信息
                    }
                    break;
                case 'd':
                    queue.showQue();
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
    }
}
class CirQueue{
    int maxSize ;
    int front;
    int rear;
    int[] arr;
    //通过构造方法初始化
    public CirQueue(int maxSize) {
        this.maxSize = maxSize;
        this.arr = new int[maxSize];
    }
    //判断队列是否为空
    public  boolean isNull(){
        //初始化都为0为true
        return front==rear;
    }
    //判断队列是否是满的
    public boolean isFull(){
        return front==(rear+1)%maxSize;
    }
    //队列中添加数据
    public void  addQueue(int data){
        //先判断队列是不是满的
        if(isFull()){
            //抛出运行时异常
            System.out.println("队列已经满了");
        }else {
            arr[rear]=data;//先放元素再后移
            rear=(rear+1)%maxSize;
        }
    }
    //从队列中删除数据
    public  int delQue(){
        //首先判断队列是否为空
        if (isNull()){
            throw new RuntimeException("队列为空");
            //System.out.println("队列为空");
        }else {
            int value  = arr[front];
            front = (front+1)%maxSize;
            return value;
        }
    }
    //遍历队列
    public  void  showQue(){
        if (isNull()){
            System.out.println("队列为空");
        }else {
            for (int i = front; i < front + (rear + maxSize - front) %maxSize; i++) {
                System.out.println(arr[i% maxSize]+"下标为"+i% maxSize);
            }
        }
    }
    //显示队列的头数据
    public int headQue(){
        if (isNull()){
            throw  new RuntimeException("队列为空");
        }
        return arr[front];
    }
}

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

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

相关文章

【MCS-51单片机汇编语言】期末复习总结⑤——定时器中断方式与查询方式程序设计(题型五)

文章目录 知识准备工作方式寄存器TMODTCON寄存器IE寄存器 定时/计数器的使用初始化 常考题型例题1题目描述题目解析题解 例题2题目描述题目解析题解 知识准备 工作方式寄存器TMOD D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0 [注]&#xff1a;TMOD高4位与T1相关&#xff0c;低…

iptables和防火墙

文章目录 1.防火墙2.Iptables基本介绍2.1 什么是iptables2.2 什么是包过滤防火墙2.3 包过滤防火墙如何实现 1.防火墙 Linux防火墙主要工作在网络层&#xff0c;针对 TCP/IP 数据包实施过滤和限制&#xff0c;典型的包过滤防火墙&#xff0c;基于内核编码实现&#xff0c;具有非…

Qt(C++)绘制指针仪表盘显示当前温度

一、功能介绍 当前文章要实现的功能: 使用Qt绘制一个仪表盘,用来显示当前的温度,绘制刻度、绘制数字、绘制温度指针。仪表盘全程使用QPainter进行绘制,QPainter是Qt框架中非常重要的一个类,绘制功能的实现离不开它。如果想要使用Qt进行高质量的绘图或UI设计,必须掌握QP…

Groovy 基本语法

一、简介 类型转换:当需要时,类型之间会自动发生类型转换: 字符串&#xff08;String&#xff09;、基本类型(如int) 和类型的包装类(如Integer) 类说明&#xff1a;如果在一个groovy 文件中没有任何类定义&#xff0c;它将被当做script 来处理&#xff0c;也就意味着这个文件将…

DragGAN-点对点的手动P图

原文网站link以及论文链接&#xff1a; https://vcai.mpi-inf.mpg.de/projects/DragGAN/ https://arxiv.org/pdf/2305.10973.pdf 简介 深度生成模型近年在合成随机真实感图像方面取得了不错的成绩。在现实世界的应用中&#xff0c;这种基于学习的图像合成方法中一个关键功能是…

文心一言 VS 讯飞星火 VS chatgpt (31)-- 算法导论5.2 3题

三、利用指示器随机变量来计算掷n 个骰子之和的期望值。 文心一言&#xff1a; 为了计算掷n个骰子之和的期望值&#xff0c;我们需要先了解一个重要的概念&#xff1a;指示器随机变量。 指示器随机变量是一种特殊的随机变量&#xff0c;它只有两个取值&#xff1a;0和1。通常…

《计算机网络——自顶向下方法》精炼——3.7(2)

读书有三到&#xff1a;谓心到&#xff0c;眼到&#xff0c;口到。——明朱熹 文章目录 对链接吞吐量的简化描述高带宽路径的TCP公平性 对链接吞吐量的简化描述 为了简化对一条TCP连接吞吐量的描述&#xff0c;我们首先忽略连接过程中处于慢启动状态的时间&#xff0c;因为这一…

AWD练习平台搭建 附虚拟机资源

文章目录 前言基本环境平台搭建系统安装平台部署环境启动实现效果 参考后记 前言 最近需要准备线下AWD了&#xff0c;但是没有那么多金币每天上BugKu的PVP在线AWD对战进行练习&#xff0c;于是想着可以自己搭建一个团队内部使用的AWD攻防平台&#xff0c;浅浅的记录一下 基本…

基于SSM框架的学生信息管理系统

项目介绍 主要功能&#xff1a; 基于Spring、SpringMVC、Mybatis框架LayUI完成了这么一套系统 ①角色登录&#xff1a;管理员登录、教师登录、学生登录 ②基本管理&#xff1a;学生管理、教师管理、班级管理、专业管理、教室管理 ③教务管理&#xff1a;课程管理、开课管理、课…

Packet Tracer - 综合技能练习

Packet Tracer - 综合技能练习 拓扑 地址分配表 32-1913 2^132^8*2^5 256*32 32个C 16 16 (1)172.16.128.0~172.16.143.255 255.255.240.0 (2)172.16.144.0~172.16.159.255 255.255.240.0 G0/0 172.16.159.254 G0/1 172.16.143.254 设备 接口 IP 地址 子网掩码 …

深入理解API网关Kong:初识Kong网关

深入理解API网关Kong&#xff1a;初识Kong网关 介绍 Kong是一个开源的、可扩展的、微服务 API 网关&#xff0c;它已经在全球范围内的各种规模的组织中广泛使用。Kong的设计原则是为了处理服务到服务的通信&#xff0c;通过提供功能丰富的平台&#xff0c;实现对API的全面管理…

Verilog基础之一、触发器实现

目录 一、触发器简介 1.1 触发器作用 1.2 触发器信号 1.3 使用规范 1.4 Vivado综合触发器 二、代码实现 三、综合结果 一、触发器简介 1.1 触发器作用 触发器是工程中基础的单元结构也是相当重要的组成&#xff0c;时序电路的实现离不开触发器。触发器是具有存储功能的器件&…

chatgpt赋能python:Python升序排序不用sort

Python 升序排序不用 sort 如果你在Python编程领域有多年的经验&#xff0c;那么你肯定对sort函数非常熟悉。sort是Python自带的用于列表或数组进行排序的函数。sort函数可以根据元素的值进行升序排序或降序排序&#xff0c;非常方便。但是&#xff0c;如果你需要在不使用sort…

【小白教程】Docker安装使用教程,以及常用命令!

【小白教程】Docker安装使用教程&#xff0c;以及常用命令&#xff01; - 带你薅羊毛最近调试Docker内容&#xff0c;顺手记录一下&#xff0c;我常用的几个命令&#xff01;这里总结一下&#xff0c;方便自己也同时方便大家使用&#xff01; 内容慢慢完善更新&#xff01;如有…

Linux 之JavaEE定制篇-搭建JavaEE 环境

Linux 之JavaEE 定制篇-搭建JavaEE 环境 注意 本篇软件链接提供 链接&#xff1a;https://pan.baidu.com/s/1y5qqQvWGQ-iz5M2WUrjD3A?pwdv5l2 提取码&#xff1a;v5l2 如果嫌自己下载麻烦或者难找可以考虑 概述 如果需要在Linux 下进行JavaEE 的开发&#xff0c;我们需要…

极速版手机蓝牙APP开发

极速版手机蓝牙APP开发 零、效果展示一、环境介绍二、开发过程控件布局代码逻辑蓝牙部分摇杆部分其他部分 三、整体优化四、结束语 零、效果展示 “这是一个充满科技风的手机蓝牙APP” 一、环境介绍 App Inventor是一款谷歌公司开发的手机编程软件&#xff0c;主要支持各种…

vue 实现 dragover拖拽到页面底部时元素自动向下滚动

公司要求做一个类似于企业微信的日程功能 然后呢 日程组件 需要能拖拽时间段创建 这里 我们使用 dragstartdragenddragover 记录被拖动位置完成的 如果没接触过 可以查看我的文章 vue记录鼠标拖拽划过位置并将划过位置变色 这里的话 其实可以在dragover中做操作 界面上 drag…

【C++ 基础篇:20】:类的 (const)static 静态成员:面试题:实现一个类,计算程序中创建出了多少个类对象?

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

区块链基础之共识机制

1.1共识机制 1.1.1核心定义 区块链上的共识机制主要解决由谁来构造区块&#xff0c;以及如何维护区块链统一的问题 1.1.2共识机制分类 1.1.3 共识算法 1.1.3.1 POW(工作量证明) 代表项目&#xff1a;BTC 由于不同的节点接受数据有所区别&#xff0c;为了保证数据一致性&a…

改善录音直播收音环境,只需一副监听耳机,丁一号G800S体验

现在很多人已经习惯了使用蓝牙耳机&#xff0c;但在平时直播、录音的时候&#xff0c;把蓝牙耳机当作耳返工具并不好用&#xff0c;经常有延迟高之类的问题&#xff0c;影响我们的录音效果和沟通体验&#xff0c;这时候需要配备一个监听耳机&#xff0c;才能够了解到实际的收音…