队列:(上)

news/2024/12/14 17:51:09/

队列:

1.队列是一个有序列表,可以用数组或是链表来实现

2.遵循先入先出得原则。即:先存入队列得数据,要先取出;后存入的要后取出

使用数组来模拟队列:

(1)创建一个ArrayQueue类

//使用数组模拟队列
class ArrayQueue {private int maxsize;  //表示数组最大容量private int first;    //队列的首部private int tail;     //队列的尾部private int[] arr;    //该数组存放数据,模拟队列//创建队列的构造函数public ArrayQueue(int maxsize) {this.maxsize = maxsize;this.arr = new int[this.maxsize];this.first = -1;  //指向队列首部的前一个位置this.tail = -1;   //指向队列尾部,队列最后一个数据}//判断队列是否满了public boolean isFull() {return first == maxsize - 1;}//判断队列是否为空public boolean isEmpty() {return first == tail;}//在队列中加入数据public void addData(int x) {if (isFull()) {System.out.println("队列已满,不能加入数据");return;}tail++;arr[tail] = x;}//获取队列中数据public int getData() {if (isEmpty()) {throw new RuntimeException("队列为空,不能做取数据操作");}first++;  //后移return arr[first];}//输出队列public void showQueue() {if (isEmpty()) {System.out.println("队列为空,没有数据");return;}for (int i = 0; i < arr.length; i++) {if (i <= first) {arr[i] = 0;}System.out.println("arr[" + i + "]=" + arr[i]);}}//显示队列的首部数据public int firstQueue() {if (isEmpty()) {throw new RuntimeException("队列为空,不能做查看数据操作");}return arr[first + 1];}}

(2)在QueueArray的main方法中来创建测试队列

public class QueueArray {public static void main(String[] args) {//测试,创建队列ArrayQueue queue = new ArrayQueue(3);Scanner scan = new Scanner(System.in);String key = "";  //用来接受用户输入boolean flag = true;  //立一个flag//输出一个菜单System.out.println("add  : 添加数据到队列");System.out.println("show : 显示队列");System.out.println("exit : 退出程序");System.out.println("get  : 从队列取出数据");System.out.println("head : 查看首部数据");while (flag) {System.out.println("请输入您的指令:");key = scan.nextLine();switch (key) {case "add":System.out.println("输出一个数");int value = scan.nextInt();queue.addData(value);break;case "show":queue.showQueue();break;case "get":try {int data = queue.getData();System.out.println("取出的数据是:" + data);} catch (Exception e) {e.printStackTrace();}break;case "head":try {int data = queue.firstQueue();System.out.println("队列头的数据是:" + data);} catch (Exception e) {e.printStackTrace();}break;case "exit":flag = false;break;default:break;}}System.out.println("程序退出");}
}

(3)测试结果:

add  : 添加数据到队列
show : 显示队列
exit : 退出程序
get  : 从队列取出数据
head : 查看首部数据
请输入您的指令:
show
队列为空,没有数据
arr[0]=0
arr[1]=0
arr[2]=0请输入您的指令:
add
输出一个数
5
请输入您的指令:
add
输出一个数
6
请输入您的指令:
add
输出一个数
9
请输入您的指令:
show
arr[0]=5
arr[1]=6
arr[2]=9请输入您的指令:
get
取出的数据是:5
请输入您的指令:
show
arr[0]=0
arr[1]=6
arr[2]=9请输入您的指令:
get
取出的数据是:6
请输入您的指令:
show
arr[0]=0
arr[1]=0
arr[2]=9请输入您的指令:
get
取出的数据是:9
请输入您的指令:
show
队列为空,没有数据
arr[0]=0
arr[1]=0
arr[2]=0请输入您的指令:

(4)当再输入add指令存入数据会发现: 目前数组使用一次就不能用了,没有达到复用的效果

请输入您的指令:
add
输出一个数
5
队列已满,不能加入数据
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at data.queue.ArrayQueue.addData(QueueArray.java:94)at data.queue.QueueArray.main(QueueArray.java:25)

于是应该将这个数组改进成一个环形数组。


http://www.ppmy.cn/news/654318.html

相关文章

消息队列问题

消息队列的使用场景&#xff1f; 消息队列主要有三大使用场景&#xff0c;分别是异步、流量削峰和应用解耦。另外还包含日志和消息通讯。 异步处理&#xff1a;相比于传统的串行、并行方式&#xff0c;提高了系统吞吐量。 流量削峰&#xff1a;可以通过消息队列长度控制请求…

消息队列(2):消息存哪里了?

一、新建消息队列并写入一条消息 编写一个简单的函数&#xff0c;打开一个消息队列&#xff0c;并发送一条消息。发送完毕后不关闭消息&#xff0c;直接退出程序。 这个消息的内容是一个结构体&#xff0c;结构体中定义了2个int型整数和1个short型整数。 代码如下&#x…

消息队列添加失败问题

题描述&#xff1a; 添加消息队列提示进程启动异常 解决办法&#xff1a; 1、按照文档检查启动命令和选择的目录是否正确 2、php的禁用函数没有删除 进入禁用函数&#xff0c;删除下列函数 proc_open pcntl_signal pcntl_signal_dispatch pcntl_fork pcntl_wait pcntl_alarm 3…

5、消息队列

1、生产者消费者模式&#xff08;基于队列&#xff09; 多个消费者同时监听一个队列&#xff0c;但是一个消息只能被最先抢到消息的消费者消费&#xff0c;即消息任务是一次性读取和处理。 一个消息一定是只 能被取出一次也就是被消费一次。 1.1、生产者发布消息 127.0.0.1:63…

27.阻塞队列

我们前面多次提到阻塞队列&#xff0c;那么阻塞队列到底是什么&#xff0c;有哪些常见的内容&#xff0c;我们这部分就来统一看一下。本节将介绍什么是阻塞队列、Java中阻塞队列的4种处理方式&#xff0c;并介绍 7种阻塞队列&#xff0c;最后分析阻塞队列的一种实现方式。 4.1…

Vue异步更新队列

之前在项目中遇到一个坑&#xff0c;需要将一个带有v-if的页面元素重新渲染&#xff0c;从而在一个方法中将绑定的data属性值连续进行置false和置true的操作&#xff0c;希望通过这样的操作让页面元素重新渲染&#xff0c;但是操作失败。之后查找原因后将问题解决&#xff0c;为…

消息队列12

MQ的相关概念 什么是MQ MQ本质上是一个先进先出的队列&#xff0c;队列里存放的内容是message&#xff0c;是一种跨进程的通信机制&#xff0c;用于上下游传递消息 在互联网架构中&#xff0c;MQ是一种常见的上下游 “逻辑解耦 物理解耦” 的消息通信服务。使用了MQ之后&am…

Windows 消息队列

Windows 消息队列 消息队列的功能使用消息队列的场合1. 客户端常常从网络上断开连接2. 客户端和服务端都在线 消息1. 消息的类型2. 消息优先级3. 消息的传递模式4. 事务消息 消息队列安装和使用消息队列1. 消息队列安装2. 创建消息队列 在 C# 中使用消息队列1. 创建消息队列2. …