栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据结构与算法之队列

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构与算法之队列

目录

1. 队列简介

2. 数组模拟队列

3. 数组模拟队列的代码实现

4. 数组模拟队列的缺点

5. 环形队列介绍

6. 数组模拟环形队列的代码实现

7.环形队列代码实现的测试


1. 队列简介

队列是线性结构的一种,其满足先进先出的特点。

2. 数组模拟队列

实现的思想主要是创建两个数分别代表队列的头部和尾部,增加数据后尾部数据+1,取出数据后头部数据+1.

3. 数组模拟队列的代码实现

这里的实现主要包括了向队列添加数据和取出数据以及遍历队列。这里使用的是object数组,在具体使用时,将object改成需要使用的数据类型即可。

public class QueueTest {
	private int maxSize;
	private int rear=-1;//表示队列的尾部(+1表示下一个添加的索引)
	private int front=-1;//表示队列的头部(+1表示下一个读取的索引)
	private Object[] queue;//表示一个队列的数组
	public QueueTest(int maxSize) {
		//创建一个队列
		this.maxSize=maxSize;
		queue=new Object[maxSize];
	}
	//增加数据
	public boolean addMember(Object newMember) {
		if(rear 

4. 数组模拟队列的缺点

在上面的实现中,我们的数组在取出数据以后前面的 空间便没有用了。此后哪怕是队列空了也没办法使用前面已经使用过的数组,这样如果数组全部都使用完了要重新创建一个队列,很浪费资源。解决的方法是将队列变成环形队列。

5. 环形队列介绍

环形队列在当数组全部被使用时,再添加一个数据会将尾部数据继续加1,这时候用数组长度取模得到的就是数组前面空出的位置,实现了数组的重复使用。

6. 数组模拟环形队列的代码实现

这里主要实现了向队列中添加数据、取出数据、遍历队列中的数据、取出头部元素和求出队列中的数据个数。在中间会需要使用到判断队列是否满和队列是否为空两个小判断。

public class CircleQueueTest {
	private int rear=0;//尾指针,取模最大长度表示当前添加数据索引
	private int front=0;//头指针,取模最大长度表示当前读取数据索引
	private int maxSize;//队列最大长度
	private int[] circleQueue;//表示一个环形队列
	public CircleQueueTest(int maxSize) {
		this.maxSize=maxSize;
		circleQueue=new int[maxSize];
	}
	
	//增加数据
	public boolean addMember(int newMember) {
		if(!isFill()) {
			circleQueue[rear%maxSize]=newMember;
			rear++;
			return true;
		}
		return false;
	}
	//取出数据
	public int getMember() throws Exception{
		if(!isEmpty()) {
			int temporary=front%maxSize;
			front++;
			return circleQueue[temporary];
		}
		throw new Exception();
	}
	//遍历队列
	public void show() {
		if(!isEmpty()) {
			for(int i=front;i!=rear;i++) {
				System.out.println(circleQueue[i%maxSize]);
			}
		}else {
			System.out.println("队列为空");
		}
	}
	//求当前队列的元素个数
	public int getNum() {
		if(isEmpty())
			return 0;
		return (rear-front)%maxSize;
	}
	//显示头元素
	public int getHead() throws Exception{
		if(!isEmpty())
			return circleQueue[front];
		throw new Exception();
	}
	//判断是否已满
	public boolean isFill() {
		if(rear!=front&&rear%maxSize==front%maxSize)
			return true;
		return false;
	}
	//判断是否为空
	public boolean isEmpty() {
		if(rear==front)
			return true;
		return false;
	}
	
	public static void main(String[] args) {
		CircleQueueTest circleQueueTest=new CircleQueueTest(3);
		circleQueueTest.addMember(1);
		circleQueueTest.addMember(2);
		circleQueueTest.addMember(3);
		circleQueueTest.addMember(4);
		int a1;
		int a2;
		try {
			int head=circleQueueTest.getHead();
			System.out.println("头元素为:"+head);
			a1 = circleQueueTest.getMember();
			a2 = circleQueueTest.getMember();
			System.out.println("第一个元素为:"+a1+"*****第二个元素为:"+a2);
		} catch (Exception e) {
			e.printStackTrace();
		}
		circleQueueTest.addMember(5);
		System.out.println("*************");
		circleQueueTest.show();
	}
}

7.环形队列代码实现的测试

上面的代码中包含了测试,其中再向队列添加元素“4”时,因为队列已满,没办法添加元素。但是在后面取出数据以后再向队列添加数据“5”又可以添加成功,所以在后面遍历数据时,遍历出来的数据时“3”和“5”。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/987765.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号