数据结构-简单队列

1.简介

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

先进先出原则。先存入队列的数据先取出,后存进队列的数据后取出。

这里对比一下,栈是后来者居上

下面使用数组来模拟队列,用数组的结构来存储队列的数据:

Queue中两个指针,front为队首,rear为队尾。maxSize是该队列的最大容量。当有数据加进来时,加到队尾,front没有变化,而rear在增加。当数据被取出,从对头取出,rear没有变化,而front在增加。front随数据输出而改变,rear随数据输入而改变。

怎么记呢?就是,现在你在军训排队,然后你来晚了迟到了,你这时候偷偷排到队尾去,队尾就后移了。然后教官是站在队伍前方的,他对着队伍说:出列!然后队头这个人就站出来了,队头这个位置就空出来了。

还可以就按超市排队结账,肯定是排在前面的人先结账,后面来的就在队尾排队,你排到了队尾,队就变长了,队尾就后移了。前面的队头的人结完账走了,队伍就变短了,队头也后移到了下一个人。

2.将数据加入队列思路:

数据加入队列,addQueue。入队处理有两个步骤:

  1. 将尾指针后移,rear+1。若队满了则不能加入数据。
  2. 若尾指针rear小于队列最大下标maxSize-1,则将数据存入rear指的这个数组元素中。否则就无法存入数据。

注:因为数组下标从0开始,队列容量maxSize,所以最大下标是maxSize-1。

3.从队列取出数据思路:

若数组为将头指针后移,front+1。若队为空则不能取出数据。

4.判断队列满和空:

当front==rear则队列为空

当rear==maxSize-1则队列满

5.将数据加入队列代码:

package com.xjj.queue;

import java.nio.Buffer;
import java.util.Scanner;

public class ArrayQueue {
    public static void main(String[] args) {
        //创建一个队列
        MyArrayQueue arrayQueue = new MyArrayQueue(3);
        //测试从控制台输入数据到队列
        char key = ' ';//接收用户输入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop) {
            System.out.print("s(show)展示队列\t");
            System.out.print("e(exit)退出\t");
            System.out.print("a(add)添加数据\t");
            System.out.print("g(get)取出数据\t");
            System.out.print("h(head)查看队头数据\t\n");
            key = scanner.next().charAt(0);//接收一个字符
            switch (key) {
                case 's':
                    arrayQueue.showQueue();
                    break;
                case 'a':
                    System.out.println("添加一个数据");
                    try{
                        int value = scanner.nextInt();//假如需要输入一个整数
                        arrayQueue.addQueue(value);
                    }
                    catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'g':
                    try {//这里用try catch是因为可能有异常抛出
                        int res = arrayQueue.getQueue();
                        System.out.printf("取出的数据为:%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());//这里的e.getMessage()就是方法里的异常消息
                    }
                    break;
                case 'h':
                    try {
                        int res = arrayQueue.headQueue();
                        System.out.printf("队头数据为:%d\n",res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();//关闭输入
                    loop=false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }
}

//用数组模拟队列
class MyArrayQueue {
    private int maxSize;//队列的最大容量
    private int front;//队列头
    private int rear;//队列尾
    private int[] QueueArr;//用于存放数据的数组,模拟队列

    //先创建队列的构造器
    public MyArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        QueueArr = new int[maxSize];
        front = -1;//指向队列头部前一个位置。当还没有在队列中添加数据时指向队列头的前一个位置
        rear = -1;//指向队列尾部。指向队列尾部的数据(就是直接是队列最后一个数据)
    }

    //判断队列是否满
    public boolean isFull() {
        return rear == maxSize - 1;//如果尾指针直接在最大下标,不就是满了吗
    }

    //判断队列是否空
    public boolean isEmpty() {
        return rear == front;
    }

    //添加数据到队列
    public void addQueue(int n) {
        //先判断队列满没满,满了就加不了数据
        if (isFull()) {
            //抛出异常
            throw new RuntimeException("队满,无法加数据");
        }
        rear++;//rear后移一位就是加进去了
        QueueArr[rear] = n;//这个队尾位置就放这个数据
    }

    //从队列中取数据,出队列
    public int getQueue() {
        if (isEmpty()) {
            //抛出异常
            throw new RuntimeException("队空,无法取数据");
        }
        front++;//front后移一位就是队头,因为front本来是指向队头前一个位置,后移一位就正好指向队头了
        return QueueArr[front];//返回队头这个数据
    }

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

    //显示队列的队头数据
    public int headQueue() {
        //判断是否为空
        if (isEmpty()) {
            throw new RuntimeException("队列为空,没有数据");
        }
        //从队列头前一位指向队列头
        return QueueArr[front+1];
    }
}

6.运行结果:

设置队列最大长度为3。先显示队列数据,再把5加入队列,显示队列

再把6和7加入队列,显示队列

在队满的情况下把8加入队列,显示队满无法加数据

再查看队头数据,为5,再从队列取数据,取出后显示队列,再查看队头数据,为6,再从队列取数据,再查看队头数据,为7

再从队列取出数据,查看队头数据,发现队列为空,再从队列取数据、显示队列,都是为空。最后退出程序。


可以看到确实用数组实现了队列。

不过这样直接用数组,取出数据之后原来队首的位置也不能放数据,浪费了。

我们从运行结果也可以看到,从队列中取出数据后,只是指针移动了,用来模拟的数组中队头数据还是在那里。但是随着指针移动,也指不到队头的前面了。

也就是数组使用一次就不能用了,没有达到复用的效果。要改进的话我们可以把这个数组改造成一个环型队列,用取模的方式。


下一篇写环形队列^_^加油加油

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion教程:额外功能/后期处理/高清化

"额外功能"对应的英文单词是Extras&#xff0c;算是直译。但是部分版本中的翻译是“后期处理”或者“高清化”&#xff0c;这都是意译&#xff0c;因为它的主要功能是放大图片、去噪、修脸等对图片的后期处理。注意这里边对图片的处理不是 Stable Diffusion 本身的能…

微软开源了 MS-DOS 4.00

DOS的历史源远流长&#xff0c;很多现在的年轻人不知道DOS了。其实早期的windows可以看做是基于DOS的窗口界面的模拟器&#xff0c;系统的本质其实是DOS。后来DOS的漏洞还是太多了&#xff0c;微软重新写了windows的底层内核。DOS只是一个辅助终端的形式予以保留了。 微软是在…

FreeRTOS学习——FreeRTOS队列(上)

本篇文章记录我学习FreeRTOS队列的相关知识&#xff0c;主要包括队列简介、队列的结构体、队列创建等知识。 队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务、任务与中断之间传递消息&#xff0c;队列中可以存储有限的、大小固定的数据项目。…

大白菜启动U盘想格式化但格式化不了

部分区域被修改分区表保护起来了。直接格式化的话&#xff0c;里面的文件夹都还在。根本格式化不了。特别是可用容量并未还原出来。 进入计算机管理》磁盘管理&#xff0c;看到U盘盘符。别搞错了。删除掉里面的已经分的区域和未分区区域&#xff0c;让它还原成一个整体。退出。…

分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测

分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测&#xff08;Matlab实…

javaweb学习week6

javaweb学习 九.登录认证 5.登录后下发令牌 生成令牌&#xff1a;引入JWT令牌操作工具类&#xff0c;登录完成后&#xff0c;调用工具类生成JWT令牌&#xff0c;并返回 代码实例&#xff1a; 6.Filter入门 概念&#xff1a;Filter过滤器&#xff0c;是Javaweb三大组件之一…

在STM32上实现无线传感器网络节点

引言 无线传感器网络&#xff08;WSN&#xff09;是物联网&#xff08;IoT&#xff09;技术的关键组成部分&#xff0c;广泛应用于环境监测、智能建筑、精密农业等领域。 本教程将介绍如何在STM32微控制器上设计和实现一个无线传感器网络节点&#xff0c;包括硬件选择、网络协…

企业计算机服务器中了helper勒索病毒怎么办?Helper勒索病毒解密处理流程

网络技术的不断发展与成熟&#xff0c;为企业的生产运营提供了极大便利&#xff0c;让企业的发展速度大大提升&#xff0c;但网络毕竟是虚拟服务系统&#xff0c;虽然可以为企业提供便利&#xff0c;但也会给企业数据安全带来严重威胁。近日&#xff0c;云天数据恢复中心接到山…

visionPro链接相机

搜索Cognex GigE Vision Configura… 修改子网掩码为255.255.255.0 配置驱动程序 更新驱动&#xff08;如果能够选择9014Bytes&#xff0c;跳过此步骤&#xff09; 更新更改 相机ip配置 打开visionPro 选择照相机 查看实时画面 运行保存图像

【论文】关于网页上能打开的文章下载PDF“显示无效或损坏的 PDF 文件”的解决办法

1. 遇到的问题 今天我在 dl.acm.org/doi 下载论文时发现下载后的pdf打开出现“显示无效或损坏的 PDF 文件” 可是在原网址是可以打开并显示的 2. 解决方案 这里我用到了和之前【论文】去除PDF论文行号的完美解决方案 的相似的解决办法 就是下载的时候不直接下载&#xf…

【java9】java9新特性之接口的私有方法

在Java 9中&#xff0c;接口可以包含私有方法&#xff08;包括静态私有方法和实例私有方法&#xff09;。这允许接口的设计者创建一些辅助方法&#xff0c;这些方法只能被接口中的其他方法所使用&#xff0c;而不能被实现该接口的类直接访问。 Java7 Java7及之前 &#xff0c…

文件缓冲区

为什么要有文件缓冲区的存在&#xff1f; 假设甲在云南&#xff0c;甲的朋友乙在北京&#xff0c;甲想给乙送个东西就需要跑到北京去&#xff1a;这时候有菜鸟驿站了&#xff0c;甲就不用跑了&#xff0c;直接把包裹交给菜鸟驿站就可以了。缓冲区就类似于菜鸟驿站&#xff0c;…

【vscode环境配置系列】vscode远程debug配置

VSCODE debug环境配置 插件安装配置文件debug 插件安装 安装C/C, C/C Runner 配置文件 在项目下建立.vscode文件夹&#xff0c;然后分别建立c_cpp_properties.json&#xff0c; launch.json&#xff0c;tasks.json&#xff0c;内容如下&#xff1a; c_cpp_properties.json:…

Dockerfile实战(SSH、Systemctl、Nginx、Tomcat)

目录 一、构建SSH镜像 1.1 dockerfile文件内容 1.2 生成镜像 1.3 启动容器并修改root密码 二、构建Systemctl镜像 2.1 编辑dockerfile文件 ​编辑2.2 生成镜像 2.3 启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;然后进行初始化 2.4 进入容器验证 三、…

进程的概念(2)

进程优先级 1.什么的优先级 概念&#xff1a;指定进程获取某种资源&#xff08;CPU&#xff09;的先后顺序 本质&#xff1a;优先级的本质是优先级数字的大小&#xff0c;Linux中优先级数字越小&#xff0c;优先级越高 task_struct 进程控制快-> struct -> 内部字段 -&g…

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL&#xff08;Access Control Lists&#xff09; 4.1.2.6 Watcher(事件…

测试开发 | 相比 Selenium,Web 自动化测试框架 Playwright 有哪些强大的优势?

Playwright 是由微软的研发团队所开发的一款 Web 自动化测试框架&#xff0c;这个框架具有多平台、跨语言的特点。除了基本的自动化测试能力之外&#xff0c;同时它还具备非常强大的录制功能、追踪功能。以下是 Playwright 与 Selenium 的对比。 ​ 由此可见&#xff0c;Play…

HTML5(2)

目录 一.列表、表格、表单 1.列表标签 2.表格 4.无语义的布局标签 5.字符实体 6.综合案例--1 7.综合案例--表单 一.列表、表格、表单 1.列表标签 1.1 无序列表 1.2 有序列表 1.3 定义列表 定义列表一般用于网页底部的帮助中心 2.表格 2.1 2.2 表格结构标签 shiftaltf 格…

chrome 安装devtools

chrome 安装devtools 下载安装 链接&#xff1a;https://github.com/vuejs/devtools 选择对应版本&#xff1a; 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

简单的图像处理算法

本笔记参考crazy_Bingo 基础&#xff1a; 图像处理都是用卷积矩阵对图像卷积计算&#xff0c;如3X3 的矩阵对640 X 480分辨率的图像卷积&#xff0c;最终会得到638 X 478 的图像。卷积过程是这样的&#xff1a; 一、中值滤波 &#xff1a; 找出矩阵中的最中间值作为像素点 中…
最新文章