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]);
		}
	}
}

总结

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

(0)

相关推荐

  • Java用数组实现循环队列的示例

    复习了下数据结构,用Java的数组实现一下循环队列. 队列的类 //循环队列 class CirQueue{ private int QueueSize; private int front; private int rear; private int[] queueList ; public CirQueue(int QueueSize){ this.QueueSize = QueueSize; queueList = new int[QueueSize]; front = 0; rear =

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

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

  • Java动态循环队列是如何实现的

    一.队列 1.1 定义 队列 (Queue) 是一种限定性的有序线性表,它只允许在表的一端插入元素,而在另一端删除元素,所以队列具有先进先出 (Fist In Fist Out,缩写为FIFO)的特性. 在队列中,允许插入的一端叫做队尾(rear): 允许删除的一端则称为队头(front). 队列是一个有序列表,可以用数组或是链表来实现. 遵循先进先出的原则.即:先存入队列的数据,要先取出. 1.2 抽象数据类型 数据元素:可以是任意类型的数据,但必须属于同一个数据对象. 关系:队列中数据元素之

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

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

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

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

  • 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数据结构基础:顺序队列和循环队列

    目录 队列: 顺序队列: 代码实现: 循环队列: 代码实现: 总结 队列: 队列是一种受限制的线性表 只允许在表的一端进行插入,另一端进行删除 插入的一端称作队尾,删除的一端称作队头 具有先进先出的特性 顺序队列: 队列底层数据采用数组存储 设置队头指针front指向队头元素前一个位置,初始值为-1 设置队尾指针rear指向队尾元素,初始值为-1 判满:rear == maxSize - 1 判空:rear == front 代码实现: //顺序队列 public class ArrayQueu

  • Java数据结构专题解析之栈和队列的实现

    目录 1. 栈 1.1 概念 1.2 助解图题 1.3 栈的数组实现 1.4 问题 1.5 栈的单链表实现 2. 队列 2.1 概念 2.2 问题 2.3 队列的单链表实现 2.4 数组实现队列 2.5 循环队列 2.6 双端队列 3. 栈和队列练习题 3.1 有效的括号 3.2 用队列实现栈 3.3 用栈实现队列 3.4 实现一个最小栈 3.5 设计循环队列 1. 栈 1.1 概念 栈:是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作. 特点:栈中的数据元素遵循先进后出的原则,但

  • Java数据结构之链表、栈、队列、树的实现方法示例

    本文实例讲述了Java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节点定义 /**链表节点定义 * @author colonel * */ class Node { public int data; Node next=null; public Node(int data){ this.data=data; } } 2.链表操作类 /**链表操作类 * @auth

  • 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数据结构之顺序表篇

    目录 一.线性表 二.顺序表 1.概念及结构 2.顺序表的实现 打印顺序表 获取顺序表的有效长度 在pos位置新增元素 判断是否包含某个元素 查找某个元素对应的位置 获取/查找pos位置的元素 给pos位置的元素设为value 删除第一次出现的关键字key 清空顺序表 3.顺序表的优.缺点 三.顺序表的实现代码汇总 一.线性表 线性表( linear list ) 是 n 个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见 的线性表:顺序表.链表.栈.队列.字符串

  • Java数据结构之顺序表的实现

    目录 前言 一.顺序表 1.1 什么是顺序表 二.简单实现顺序表 2.1 创建顺序表 2.2 打印顺序表 2.3 获取顺序表长度 2.4 在 pos 位置新增元素 2.5 判定是否包含某个元素 2.6 查找某个元素对应的位置 2.7 获取 pos 位置的元素 2.8 给 pos 位置的元素设为 value 2.9 删除你想要删除的元素 2.10 清空顺序表 三.MyArrayList.java 四.Test.java 前言 线性表(linear list)是n个具有相同特性的数据元素的有限序列.

  • Java数据结构之顺序表和链表精解

    目录 前言 1. 顺序表 代码实现 2. 链表 链表图解 代码实现 前言 两个数据结构:顺序表和链表 数据结构是一门学科,和语言无关. 数据 + 结构:一种描述和组织数据的方式. 1. 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改.其逻辑上和物理上都是连续的. 问题引入:一个数组放在这,我们如何才能自己不去数,让程序自己进行计数? 答:在引入变量,每次放一个元素就更新一次.(如下图,为问题的示意) 也就是说顺序表的底层

  • C语言详解链式队列与循环队列的实现

    目录 队列的实现 链式队列 链式队列的定义 链式队列的实现 循环队列 循环队列的定义 循环队列的实现 队列的实现 队列是一种先进先出(First in First Out)的线性表,简称FIFO.与栈不同,栈是一种后进先出(先进后出)的线性表.在队列中,允许插入的一端称为队尾,允许删除的一端称为队头.假设队列是q=(a1,a2,…,an),那么a1就是队头元素,而an是队尾元素.这样我们就可以删除时,总是从a1开始,而插入时,列在最后.这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后

随机推荐