Java编程内功之怎么实现队列
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,Java编程内功之怎么实现队列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。基本介绍队列是一个有序列表,可以用数组或者链表来实现遵循先入
千家信息网最后更新 2025年02月01日Java编程内功之怎么实现队列
Java编程内功之怎么实现队列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
基本介绍
队列是一个有序列表,可以用数组或者链表来实现
遵循先入先出的原则,即先存入队列的数据,要先取出.后存入的要后取出
数组模拟队列
队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量.
因为队列的输入\输出是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变.
代码案例
package com.structures.queue; import java.util.Scanner; public class ArrayQueueDemo { public static void main(String[] args) { ArrayQueue arrayQueue = new ArrayQueue(3); char key = ' ';//接受用户输入 Scanner scanner = new Scanner(System.in); boolean loop = true; //输出一个菜单 while (loop) { System.out.println("s(show):显示队列"); System.out.println("e(exit):退出程序"); System.out.println("a(add):添加数据到队列"); System.out.println("g(get):从队列取出数据"); System.out.println("h(head):查看队列头的数据"); key = scanner.next().charAt(0); switch (key) { case 's': arrayQueue.showQueue(); break; case 'a': System.out.println("输入一个整数"); int value = scanner.nextInt(); arrayQueue.addQueue(value); break; case 'g': try { int queue = arrayQueue.getQueue(); System.out.printf("取出的数据是%d", queue); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'e': scanner.close(); loop = false; break; case 'h': try { int head = arrayQueue.headQueue(); System.out.printf("取出队列头的数据是%d", head); }catch (Exception e){ System.out.println(e.getMessage()); } default: break; } } System.out.println("程序退出"); } } //使用数组模拟队列-编写一个ArrayQueue类 class ArrayQueue { //表示数组最大容量 private int maxSize; //队列头 private int front; //队列尾 private int rear; //用于存放数据,模拟队列 private int[] arr; //创建队列构造器 public ArrayQueue(int arrMaxSize) { maxSize = arrMaxSize; arr = 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()) { System.out.println("队列不能加入数据"); return; } rear++;//让rear 后移 arr[rear] = n; } //获取队列数据,出队列 public int getQueue() { if (isEmpty()) { throw new RuntimeException("队列为空,不能取数据"); } front++; return arr[front]; } //显示队列所有数据 public void showQueue() { if (isEmpty()) { System.out.println("队列为空,没有数据"); } for (int i = 0; i < this.arr.length; i++) { System.out.printf("arr[%d]=%d\n", i, arr[i]); } } //显示队列的头数据,注意不是取数据 public int headQueue() { if (isEmpty()) { throw new RuntimeException("队列为空,没有数据"); } return arr[front + 1]; } }
问题分析
鸿蒙官方战略合作共建--HarmonyOS技术社区
目前这个数组使用一次就不能用,没有达到复用的效果.
将这个数组使用算法,改进成一个环形的队列:取模%
改进成环形队列的思路分析
鸿蒙官方战略合作共建--HarmonyOS技术社区
front变量的含义做一个调整:front 就指向队列的第一个元素,也就是arr[front]就是队列的第一个元素,front的初始值=0
rear变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定.rear初始值=0
当队列满时,条件是(rear+1)%maxSize = front.
当队列为空时条件,rear == front 空.
当我们这样分析,队列中有效的数据的个数=(rear+maxSize-front)%maxSize.
环形队列代码案例
package com.structures.queue; import java.util.Scanner; public class CircleArrayQueue { public static void main(String[] args) { CircleArray arrayQueue = new CircleArray(4);//这里设置4,其队列的有效数据最大是3 char key = ' ';//接受用户输入 Scanner scanner = new Scanner(System.in); boolean loop = true; //输出一个菜单 while (loop) { System.out.println("s(show):显示队列"); System.out.println("e(exit):退出程序"); System.out.println("a(add):添加数据到队列"); System.out.println("g(get):从队列取出数据"); System.out.println("h(head):查看队列头的数据"); key = scanner.next().charAt(0); switch (key) { case 's': arrayQueue.showQueue(); break; case 'a': System.out.println("输入一个整数"); int value = scanner.nextInt(); arrayQueue.addQueue(value); break; case 'g': try { int queue = arrayQueue.getQueue(); System.out.printf("取出的数据是%d", queue); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'e': scanner.close(); loop = false; break; case 'h': try { int head = arrayQueue.headQueue(); System.out.printf("取出队列头的数据是%d", head); }catch (Exception e){ System.out.println(e.getMessage()); } default: break; } } System.out.println("程序退出"); } } class CircleArray { //表示数组最大容量 private int maxSize; //front变量的含义做一个调整:front 就指向队列的第一个元素,也就是arr[front]就是队列的第一个元素,front的初始值=0 private int front; //rear变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定.rear初始值=0 private int rear; //用于存放数据,模拟队列 private int[] arr; public CircleArray(int arrMaxSize) { maxSize = arrMaxSize; arr = new int[maxSize]; } //判断队列是否满 public boolean isFull() { return (rear + 1) % maxSize == front; } //判断队列是否为空 public boolean isEmpty() { return rear == front; } //添加数据到队列 public void addQueue(int n) { if (isFull()) { System.out.println("队列满,队列不能加入数据"); return; } //直接将数据加入 arr[rear] = n; //将rear后移,这里必须考虑取模 rear = (rear + 1) % maxSize; } //获取队列数据,出队列 public int getQueue() { if (isEmpty()) { throw new RuntimeException("队列为空,不能取数据"); } //这里需要分析front是指向队列的第一个元素, //1.先把front对应的值保存到一个临时变量, //2.将front后移,考虑取模 //3.将临时保存的变量返回 int value = arr[front]; front = (front + 1) % maxSize; return value; } //显示队列所有数据 public void showQueue() { if (isEmpty()) { System.out.println("队列为空,没有数据"); } //从front开始遍历 for (int i = front; i < front + size(); i++) { System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]); } } //求出当前队列有效数据的个数 public int size() { return (rear + maxSize - front) % maxSize; } //显示队列的头数据,注意不是取数据 public int headQueue() { if (isEmpty()) { throw new RuntimeException("队列为空,没有数据"); } return arr[front]; } }
看完上述内容,你们掌握Java编程内功之怎么实现队列的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
队列
数据
数组
元素
变量
指向
输入
最大
含义
程序
分析
调整
输出
有效
位置
容量
就是
环形
问题
后移
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据通信与网络技术试题
九台区通用网络技术质量推荐
学历低可以学软件开发吗
nas达芬奇协同数据库体验
网络安全法手抄报模版
软件开发的测试方法有哪些
游客的服务器
软件开发工程师目标分析
江苏网络软件开发供应
网络安全正确使用
幼儿园学校网络安全管理制度
桐源网络技术
康健网络技术
华为服务器稳定吗
烟台春牧网络技术有限公司
耳机主板软件开发平台有哪些
怀化学院专升本数据库原理
网络软件开发企业费用票
服务器和终端拨号
当前网络技术主流
软件开发黄埔军校
企业网络安全应急预警通知书
计算机网络技术女生学的多吗
软件开发大概需要多少时间
软件开发网著名 湖南岚鸿
计算机三级 网络技术要求
维护网络安全横幅
梅州软件开发招聘
网络安全管理制度体系评审表
监控系统网络安全管理条例