Java循环队列与非循环队列的区别总结


Posted in Java/Android onJune 22, 2021

非循环循环队列

  • 判满:(rear+1) % maxsize == front
  • 判空:front == rear
  • 队列元素个数:rear = (rear + maxsize - front) % maxsize
  • front指针移动方式:front = (front + 1) % maxsize
  • rear指针移动方式:rear= (rear+ 1) % maxsize
import java.awt.Font;
import java.util.Scanner;
import javax.management.RuntimeErrorException;

public class CircleArrayQueueDemo {

	public static void main(String[] args) {
		//创建队列
		CircleArrayQueue circleArrayQueue = new CircleArrayQueue(4);
		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':
				circleArrayQueue.showQueue();
				break;
			case 'e':
				circleArrayQueue.showQueue();
				break;
			case 'a':
				System.out.println("输入一个数");
				int value = scanner.nextInt();
				circleArrayQueue.addQueue(value);
				break;
			case 'g':
				try {
					int res = circleArrayQueue.getQueue();
					System.out.printf("取出的数据是%d\n",res);
				}catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'h':
				try {
					int res = circleArrayQueue.headQueue();
					System.out.printf("队列头的数据是%d\n",res);
				}catch (Exception e) {
					System.out.println(e.getMessage());

				}
				break;
			

			default:
				scanner.close();
				loop = false;
				break;
			}
		}
		System.out.println("程序退出");

	}

} 
//队列
class CircleArrayQueue{
	private int maxsize;
	private int front;
	private int rear;
	private int[] arr;
	//构造器
	public CircleArrayQueue(int arrmaxsize) {
		maxsize = arrmaxsize;
		front = 0;
		rear = 0;
		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("队列为空,不可取出元素!");
		}
		//取值
		int value = arr[front];
		//front后移
		front = (front + 1)%maxsize;
		return value;
	}
	//遍历
	public void showQueue() {
		if(isEmpty()) {
			System.out.println("队列为空!");
			return;
		}
		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循环队列与非循环队列的区别总结
Java循环队列与非循环队列的区别总结
Java循环队列与非循环队列的区别总结

循环队列

  • 判满:(rear+1) % maxsize == front
  • 判空:front == rear
  • 队列元素个数:rear = (rear + maxsize - front) % maxsize
  • front 指针移动方式:front = (front + 1) % maxsizer
  • ear指针移动方式:rear= (rear+ 1) % maxsize
import java.awt.Font;
import java.util.Scanner;
import javax.management.RuntimeErrorException;

public class CircleArrayQueueDemo {

	public static void main(String[] args) {
		//创建队列
		CircleArrayQueue circleArrayQueue = new CircleArrayQueue(4);
		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':
				circleArrayQueue.showQueue();
				break;
			case 'e':
				circleArrayQueue.showQueue();
				break;
			case 'a':
				System.out.println("输入一个数");
				int value = scanner.nextInt();
				circleArrayQueue.addQueue(value);
				break;
			case 'g':
				try {
					int res = circleArrayQueue.getQueue();
					System.out.printf("取出的数据是%d\n",res);
				}catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'h':
				try {
					int res = circleArrayQueue.headQueue();
					System.out.printf("队列头的数据是%d\n",res);
				}catch (Exception e) {
					System.out.println(e.getMessage());

				}
				break;
			

			default:
				scanner.close();
				loop = false;
				break;
			}
		}
		System.out.println("程序退出");

	}

} 
//队列
class CircleArrayQueue{
	private int maxsize;
	private int front;
	private int rear;
	private int[] arr;
	//构造器
	public CircleArrayQueue(int arrmaxsize) {
		maxsize = arrmaxsize;
		front = 0;
		rear = 0;
		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("队列为空,不可取出元素!");
		}
		//取值
		int value = arr[front];
		//front后移
		front = (front + 1)%maxsize;
		return value;
	}
	//遍历
	public void showQueue() {
		if(isEmpty()) {
			System.out.println("队列为空!");
			return;
		}
		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循环队列与非循环队列的区别总结
Java循环队列与非循环队列的区别总结
Java循环队列与非循环队列的区别总结

到此这篇关于Java循环队列与非循环队列的区别总结的文章就介绍到这了,更多相关Java循环队列与非循环队列内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
Spring Bean的实例化之属性注入源码剖析过程
Jun 13 Java/Android
Java实现多线程聊天室
Jun 26 Java/Android
浅谈自定义校验注解ConstraintValidator
Jun 30 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
JVM钩子函数的使用场景详解
Aug 23 Java/Android
springboot新建项目pom.xml文件第一行报错的解决
Jan 18 Java/Android
maven依赖的version声明控制方式
Jan 18 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
Mar 21 Java/Android
Netty客户端接入流程NioSocketChannel创建解析
Mar 25 Java/Android
Springboot-cli 开发脚手架,权限认证,附demo演示
Apr 28 Java/Android
使用Postman测试需要授权的接口问题
Jun 21 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 Java/Android
springBoot基于webSocket实现扫码登录
Jun 22 #Java/Android
SpringBoot集成Redis,并自定义对象序列化操作
Java如何实现树的同构?
启动Tomcat时出现大量乱码的解决方法
详解java如何集成swagger组件
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
java中重写父类方法加不加@Override详解
Jun 21 #Java/Android
You might like
用文本文件制作留言板提示(下)
2006/10/09 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
Laravel下生成验证码的类
2017/11/15 PHP
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
世界经理人咨询有限公司面试
2014/09/23 面试题
How to spawning asynchronous work in J2EE
2016/08/29 面试题
应届护士推荐信
2013/11/16 职场文书
大学生就业意向书范文
2014/04/01 职场文书
授权委托书格式模板
2014/04/03 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS