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 相关文章推荐
浅析NIO系列之TCP
Jun 15 Java/Android
启动Tomcat时出现大量乱码的解决方法
Jun 21 Java/Android
mybatis中sql语句CDATA标签的用法说明
Jun 30 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
SpringDataJPA实体类关系映射配置方式
Dec 06 Java/Android
深入浅出讲解Java8函数式编程
Jan 18 Java/Android
alibaba seata服务端具体实现
Feb 24 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
spring IOC容器的Bean管理XML自动装配过程
May 30 Java/Android
java获取一个文本文件的编码(格式)信息
Sep 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
献给php初学者(入门学习经验谈)
2010/10/12 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
php下获取http状态的实现代码
2014/05/09 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php单例模式实现方法分析
2015/03/14 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
PHP 实现链式操作
2021/03/09 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
Django中使用locals()函数的技巧
2015/07/16 Python
python版本的仿windows计划任务工具
2018/04/30 Python
python实战之实现excel读取、统计、写入的示例讲解
2018/05/02 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
机关单位工作失职检讨书
2014/11/20 职场文书
音乐剧猫观后感
2015/06/04 职场文书
世界名著读书笔记
2015/06/25 职场文书