数据结构-简单队列

server/2024/9/24 21:29:28/

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.ppmy.cn/server/28749.html

相关文章

【论文阅读】互连网络的负载平衡路由算法 (CQR, Channel Queue Routing 通道队列路由)

Channel Queue Routing (CQR) 通道队列路由 1. Channel Queue Routing (CQR) 的动机 (1) 排队论(queueing theory)模型(2) GAL’s latency on tornado traffic(3) Routing tornado traffic with CQR 2. Channel Queue Routing 通道队列路由3. CQR 的性能4. 总结 Channel Queu…

Fast-DetectGPT 无需训练的快速文本检测

本文提出了一种新的文本检测方法 ——Fast-DetectGPT&#xff0c;无需训练&#xff0c;直接使用开源小语言模型检测各种大语言模型&#xff0c;如GPT等生成的文本内容。 Fast-DetectGPT 将检测速度提高了 340 倍&#xff0c;将检测准确率相对提升了 75%&#xff0c;超过商用系…

上市企业数字赋能指数数据集-2001到2022年(TF-IDF)

01、数据简介 上市公司数字赋能指数是一个用来衡量上市公司利用数字技术提高业务能力和效率的指标。这个指数反映了上市公司利用大数据、云计算和人工智能等数字技术&#xff0c;高效地利用商业资源和信息&#xff0c;并扩展供应关系的能力。市公司数字赋能指数是一种综合性的…

搭建vue3组件库(三): CSS架构之BEM

文章目录 1. 通过 JS 生成 BEM 规范名称1.1 初始化 hooks 目录1.2 创建 BEM 命名空间函数1.3 通过 SCSS 生成 BEM 规范样式 2. 测试 BEM 规范 BEM 是由 Yandex 团队提出的一种 CSS 命名方法论&#xff0c;即 Block&#xff08;块&#xff09;、Element&#xff08;元素&#xf…

什么是RabbitMQ,RabbitMQ基本概念,RabbitMQ的使用场景

目录 面试官:什么是RabbitMQ,RabbitMQ的使用场景什么是RabbitMQ?RabbitMQ基本概念RabbitMQ的使用场景举例该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是RabbitMQ,RabbitMQ的使用场景 …

OpenHarmony实战开发-动画曲线、如何实现动画衔接

UI界面除了运行动画之外&#xff0c;还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时&#xff0c;UI界面应做到即时响应。例如用户在应用启动过程中&#xff0c;上滑退出&#xff0c;那么启动动画应该立即过渡到退出动画&#xff0c;而不应该等启动动画完…

PG数据库结构与oracle比较

1.数据库集簇逻辑结构 数据库集簇概念&#xff1a;一个大的数据库是由若干个小的数据库组成&#xff0c;实现数据的隔离存放&#xff0c;在概念上应该是与mysql一样的 在mysql中可以用show database列出数据库 PG中用\l 数据库对象存放在数据库中&#xff1a; PG中的所有数据…

cve-2018-19518漏洞复现

一、靶场的启动 在相应的文件夹位置打开终端后进行如下操作 1.运行此靶场 sudo docker-compose up -d 2.查看启动环境 sudo docker ps 3.关闭此靶场环境 docker-compose down 二、漏洞内容简介 php imap扩展用户在php中执行邮件收发操作&#xff0c;其imap_open函数会调用rsh…