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

非循环循环队列

  • 判满:(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];
	}

结果示意图



循环队列

  • 判满:(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循环队列与非循环队列内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java基础之数组模拟循环队列

    一.队列简介 队列是一个有序列表,遵循"先入先出"的原则,即先存入队列的数据要先取出,后存入的数据后取出. 队列有两种存储表示,顺序表示和链式表示.顺序表示可以用数组来实现. 二.数组模拟队列 用数组模拟队列时,设两个值front=0,rear=0.front表示队列首部第一个数据所在位置,rear表示尾部最后一个数据的下一个位置. 将数据插入数组队列时(入队),从尾部进行插入,即array[rear] = value,同时rear后移,rear++.取出数据时(出队),从头部取出数据

  • Java数据结构之循环队列简单定义与用法示例

    本文实例讲述了Java数据结构之循环队列简单定义与用法.分享给大家供大家参考,具体如下: 一.概述: 1.原理: 与普通队列的区别在于循环队列添加数据时,如果其有效数据end == maxSize - 1(最大空间)的话,end指针又移动到-1的位置 删除数据时,如果head== maxSize时 head指针移动到0的位置 2.示例图: 二.实现代码: package com.java.queue; /** * @描述 对列 * @项目名称 Java_DataStruct * @包名 com.

  • Java 1.8使用数组实现循环队列

    本文实例为大家分享了Java 1.8使用数组实现循环队列的具体代码,供大家参考,具体内容如下 1.引入 使用数组实现循环队列,功能如下: 1)isFull():队列满? 2)isEmpty():队列空? 3)add():添加元素. 4)pop():移除元素. 5)display():展示队列. 6)getSize():获取当前队列元素个数. 2.代码 package DataStructure; import java.util.Arrays; /** * @author: Inki * @em

  • java数据结构与算法之双向循环队列的数组实现方法

    本文实例讲述了java数据结构与算法之双向循环队列的数组实现方法.分享给大家供大家参考,具体如下: 需要说明的是此算法我并没有测试过,这里给出的相当于伪代码的算法思想,所以只能用来作为参考! package source; public class Deque { private int maxSize; private int left; private int right; private int nItems; private long[] myDeque; //constructor p

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

    非循环循环队列 判满:(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.manag

  • ​​​​​​​Java公平锁和非公平锁的区别

    目录 正文 应用场景 公平和非公平锁代码演示 执行流程分析 公平锁执行流程 非公平锁执行流程 优缺点分析 总结 前言: 从公平的角度来说,Java 中的锁总共可分为两类:公平锁和非公平锁.但公平锁和非公平锁有哪些区别?孰优孰劣呢?在 Java 中的应用场景又有哪些呢?接下来我们一起来看. 正文 公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的,最前面的线程总是最先获取到锁.非公平锁:每个线程获取锁的顺序是随机的,并不会遵循先来先得的规则,所有线程会竞争获取锁.  举个例子:公平锁就像

  • java队列实现方法(顺序队列,链式队列,循环队列)

    双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略.ArrayDeque包括顺序栈和顺序队列,LinkedList包含链式栈和链式队列.ArrayDeque和LinkedList都是线程不安全的.PriorityQueue优先队列也在JDK. 1.顺序队列的实现 package lang; import java.io.Serializable; import java.util.Arrays; /** * @ClassName: ArrayQueue *

  • Java数据结构与算法之循环队列的实现

    目录 概述 循环队列 循环队列实现 改变队列大小 enqueue 方法 dequeue 方法 main 完整代码  概述 从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章. 循环队列 循环队列 (Circular Queue) 是一种特殊的队列. 循环队列解决了队列出队时需要将所有数据前移一位 (复杂度为 O(n)) 的问题. 循环队列的底层依然是数组, 不过增加了指向头和尾的指针. 循环队列实现 判断队列是否为空: 当头指针 Q.front == 尾指针 Q.rear,

  • 循环队列详解及队列的顺序表示和实现

    循环队列--队列的顺序表示和实现 前面分析顺序队的时候,我们知道,顺序队存在"假溢出"的问题,这个问题有时会造成很大的内存浪费,循环队列就是为了解决这个问题而提出地一个很巧妙的办法.循环队列和顺序队列的主要区别在于:循环队列将顺序队列臆造成一个环状空间.在操作上这种异同体现在: 相同点: 在顺序队列和循环队列中,进行出队.入队操作时,队首.队尾指针都要加 1 ,朝前移动. 不同点: 1. 在循环队列中当队首.队尾指针指向向量上界(MAX_QUEUE_SIZE-1) 时,其加1 操作的结

  • C++实现循环队列和链式队列的示例

    循环队列: 1.循环队列中判断队空的方法是判断front==rear,队满的方法是判断front=(rear+1)%maxSize.(我曾经想过为什么不用一个length表示队长,当length==maxSize时队满)原因就是,在频繁的队列操作中,多出一个变量会大量的增加执行时间,所以不如浪费一个数组空间来得划算. 2.用单链表表示的链式队列特别适合于数据元素变动较大的情形,而且不存在溢出的情况. template<class T> class SeqQueue{ protected: T

  • 深入理解Java线程编程中的阻塞队列容器

    1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程.阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素. 阻塞队列提供了四种处理方法: 抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException("Q

  • 详解Java线程池队列中的延迟队列DelayQueue

    目录 DelayQueue延迟队列 DelayQueue使用场景 DelayQueue属性 DelayQueue构造方法 实现Delayed接口使用示例 DelayQueue总结 在阻塞队里中,除了对元素进行增加和删除外,我们可以把元素的删除做一个延迟的处理,即使用DelayQueue的方法.本文就来和大家聊聊Java线程池队列中的DelayQueue—延迟队列 public enum QueueTypeEnum { ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQ

  • Java面试必备之AQS阻塞队列和条件队列

    一.AQS入队规则 我们仔细分析一下AQS是如何维护阻塞队列的,在独占方式获取资源的时候,是怎么将竞争锁失败的线程丢到阻塞队列中的呢? 我们看看acquire方法,这里首先会调用子类实现的tryAcquire方法尝试修改state,修改失败的话,说明线程竞争锁失败,于是会走到后面的这个条件: 这个addWaiter方法就是将当前线程封装成一个Node.EXCLUSIVE类型的节点,然后丢到阻塞队列中: 第一次还没有阻塞队列的时候,会到enq方法里面,我们仔细看看enq方法 enq()方法中,我们

随机推荐