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 相关文章推荐
Java内存模型之happens-before概念详解
Jun 13 Java/Android
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
解决tk mapper 通用mapper的bug问题
Jun 16 Java/Android
详解java如何集成swagger组件
Jun 21 Java/Android
使用Springboot实现健身房管理系统
Jul 01 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
Jul 16 Java/Android
Spring事务管理下synchronized锁失效问题的解决方法
Mar 31 Java/Android
SpringBoot整合Minio文件存储
Apr 03 Java/Android
Java设计模式中的命令模式
Apr 28 Java/Android
JAVA springCloud项目搭建流程
May 11 Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
Jul 23 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
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
php实现的双向队列类实例
2014/09/24 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
js控制table合并具体实现
2014/02/20 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
Vue如何实现监听组件原生事件
2020/07/03 Javascript
js实现网页随机验证码
2020/10/19 Javascript
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
Python可跨平台实现获取按键的方法
2015/03/05 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
Python argparse模块使用方法解析
2020/02/20 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
什么是python的列表推导式
2020/05/26 Python
Python编写万花尺图案实例
2021/01/03 Python
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
国家助学金获奖感言
2014/01/31 职场文书
出国英文推荐信
2014/05/10 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏