java队列

1.什么是队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

每次在队尾插入一个元素是,rear增1;删除一个元素时front增一。

2.队列的分类

队列可以划分为顺序队列,循环队列

顺序队列就是建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,不过顺序队列有个致命的缺陷就是尾指针和头指针都会不断增长造成空间的大量冗余(就好比用数组来存,指针不断后移,不回头那种,就会造成前面的空间浪费)

循环队列就是把数组看成一个环形(FBI WARNING 此方法很6),在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。自己真从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。

除了一些简单应用之外,真正实用的队列是循环队列,在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件时front=rear,而队列判满的条件时front=(rear+1)%MaxSize。


这一步关键在于理解(rear+1)%MaxSize这个思维,这个思维的关键在于是谁追上谁,所以数组中只允许存储最大长度-1个数据。


package Queue;

/*
 * 队列
 * @author WLNSSS
 * @time 2017.12.26
 * */
public class QueueTest {
	//实际存储的数组
	private int array[]=null;
	
	//头指针和尾指针
	private int head;
	private int tail;
	
	//能存储的最大长度
	private int maxLen;
	
	//构造器
	public QueueTest() {
		// TODO Auto-generated constructor stub
		this(10);
	}
	
	public QueueTest(int len)
	{
		array=new int[len];
		head=0;
		tail=0;
		maxLen=array.length;
	}
	
	//入队
	void add(int data)
	{
		//如果入队不是满的则入队
		if(isFull())
		{
		System.out.println("Queue full");
		}
		else
		{
			array[tail]=data;
			tail=(tail+1)%maxLen;
			
		}
			
	}
	
	//出队
	void delete()
	{
		//如果不是空则出队
		if(isNull())
		{
			System.out.println("isNull");
		}
		else
		{
			
			array[head]=0;
			head=(head+1)%maxLen;
			
		}
	}
	
	//展示队里的内容
	void display()
	{
		
		for(int i=0;i<3;i++)
		{
			
			System.out.println(array[i]+"head:"+head+"tail"+tail);
		}
	}
	
	Boolean isFull()
	{
		if((tail+1)%maxLen ==head)
		{
			return true;
		}
		
		return false;
		
	}
	
	Boolean isNull()
	{
		if(head==tail)
		{
			return true;
		}
		
		return false;
		
	}
	
	public static void main(String[] args) {
		QueueTest qt = new QueueTest(3);
		qt.add(5);
		qt.add(10);
		qt.delete();
		qt.add(10);
		qt.add(10);
		qt.delete();
		qt.add(3);
		qt.add(2);
		qt.delete();
		qt.add(2);

		qt.display();
		
		System.exit(0);
	}
	
	

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值