java数据结构基础:顺序队列和循环队列

 更新时间:2021年08月01日 10:34:16   作者:去吧猫头夜鹰  
下面小编就为大家分享一篇java队列实现方法(顺序队列,循环队列),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

队列:

队列是一种受限制的线性表

只允许在表的一端进行插入,另一端进行删除

插入的一端称作队尾,删除的一端称作队头

具有先进先出的特性

顺序队列:

队列底层数据采用数组存储

设置队头指针front指向队头元素前一个位置,初始值为-1

设置队尾指针rear指向队尾元素,初始值为-1

判满:rear == maxSize - 1

判空:rear == front

代码实现:

//顺序队列
public class ArrayQueue {
	private int maxSize;    //数组的最大容量
	private int front;        //队头指针
	private int rear;        //队尾指针
	private int[] array;    //存放数据
	public ArrayQueue(int arrMaxSize) {
		maxSize = arrMaxSize;
		array = 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后移
		array[rear] = n;
	}
	//出队
	public int getQueue() {
		//判断队列是否空
		if (isEmpty()) {
			throw new RuntimeException("队列为空");
		}
		front++;    //front后移
		return array[front];
	}
	//取队头数据
	public int headQueue() {
		if (isEmpty()) {
			throw new RuntimeException("队列为空");
		}
		return array[front + 1];
	}
	//输出队列所有数据
	public void showQueue() {
		//遍历输出
		if (isEmpty()) {
			System.out.println("队列为空");
            return;
		}
		for (int i = 0; i < array.length; i++) {
			System.out.printf("array[%d] = %d\n", i, array[i]);
		}
	}
}

顺序队列存在假溢出现象,故使用循环队列替代顺序队列

循环队列:

队列底层数据仍然采用数组存储

为了便于判空和判满,在数组中预留一个空间,认为只留下一个空间的时候队列为满

设置队头指针front指向队头元素,初始值为0

设置队尾指针rear指向队尾元素的后一个位置,初始值为0

判满:(rear + 1) % maxSize == front

判空:rear == front

取得当前队列有效数据个数:(rear + maxSize - front) % maxSize

代码实现:

//循环队列
public class CircleQueue {
	private int maxSize;    //数组的最大容量
	private int front;        //队头指针
	private int rear;        //队尾指针
	private int[] array;    //存放数据
	public CircleQueue(int arrMaxSize) {
		maxSize = arrMaxSize;
		array = new int[maxSize];
		front = 0;        //指向队头的前一个位置
		rear = 0;        //指向队尾
	}
	//判断队列是否满
	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;
		}
		array[rear] = n;
		rear = (rear + 1) % maxSize;
	}
	//出队
	public int getQueue() {
		//判断队列是否空
		if (isEmpty()) {
			throw new RuntimeException("队列为空");
		}
		//保存front对应的值
		int value = array[front];
		front = (front + 1) % maxSize;
		return value;
	}
	//取队头数据
	public int headQueue() {
		if (isEmpty()) {
			throw new RuntimeException("队列为空");
		}
		return array[front];
	}
	//获取当前队列有效数据个数
	public int size() {
		return (rear + maxSize - front) % maxSize;
	}
	//输出队列所有数据
	public void showQueue() {
		//遍历输出
		if (isEmpty()) {
			System.out.println("队列为空");
            return;
		}
		//从front开始遍历
		for (int i = front; i < front + size(); i++) {
			System.out.printf("array[%d] = %d\n", i % maxSize, array[i % maxSize]);
		}
	}
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Activiti如何动态获取流程图过程详解

    Activiti如何动态获取流程图过程详解

    这篇文章主要介绍了Activiti如何动态获取流程图过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java 基于maven多模块合并打包部署的操作过程

    java 基于maven多模块合并打包部署的操作过程

    这篇文章主要介绍了java 基于maven多模块合并打包部署的操作过程,本文通过实例代码图文相结合给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • SpringBoot使用Async注解失效原因分析及解决(spring异步回调)

    SpringBoot使用Async注解失效原因分析及解决(spring异步回调)

    这篇文章主要介绍了SpringBoot使用Async注解失效原因分析及解决(spring异步回调),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 使用原生JDBC动态解析并获取表格列名和数据的方法

    使用原生JDBC动态解析并获取表格列名和数据的方法

    这篇文章主要介绍了使用原生JDBC动态解析并获取表格列名和数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • java反射机制Reflection详解

    java反射机制Reflection详解

    在本篇文章里小编给大家分享了关于java反射机制Reflection的相关知识点,需要的朋友们学习下。
    2019-04-04
  • 基于Zookeeper实现服务注册和服务发现功能

    基于Zookeeper实现服务注册和服务发现功能

    无论是采用SOA还是微服务架构,都需要使用服务注册和服务发现组件,本文将基于 Zookeeper 实现服务注册和服务发现功能,如果跟我一样有同样的困惑,希望可以通过本文了解其他组件如何使用 Zookeeper 作为注册中心的工作原理
    2023-09-09
  • java实现多客户聊天功能

    java实现多客户聊天功能

    这篇文章主要为大家详细介绍了java实现多客户聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java Swing JToggleButton开关按钮的实现

    Java Swing JToggleButton开关按钮的实现

    这篇文章主要介绍了Java Swing JToggleButton开关按钮的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 如何修改覆盖spring boot默认日志策略logback详解

    如何修改覆盖spring boot默认日志策略logback详解

    这篇文章主要给大家介绍了关于如何修改覆盖spring boot默认日志策略logback的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Java生产者和消费者例子_动力节点Java学院整理

    Java生产者和消费者例子_动力节点Java学院整理

    生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。下文通过实例给大家介绍java生产者和消费者,感兴趣的朋友一起学习吧
    2017-05-05

最新评论