数据结构-循环数组实现队列

* 队列的特点:先进先出
 * 与堆栈相比,栈的操作始终是一个方向,而队列的操作在两端
 *
 * 如果按照原始的方法(即不考虑空间浪费,直接插,插到底拉倒)实现队列,那么当一边添加,一边删除时,添加到最后,rear到索引最大值(这时又不能往回插入)
 * 必会造成大量空间浪费,为了尽可能利用资源空间,采用循环数组的机制来减少浪费
 *
 * 使用循环数组会出现的问题:
 *     1.如何实现循环数组?
 *  2.实现了循环数组后,当队列空 rear==front , 当队列满也是 rear==front ,那么如何区分这两者?
 *  

 *  回答:

     关键点在于(front+1)% maxSize ,下面两个操作都是基于此完成的

 *     1.实现循环数组很简单,只需要对索引变量取余即可
 *     2.rear==front当此条件成立,队列为空,这点不变,主要更改队列满的条件,在对队列操作中

 *  让rear front之间至少空一个位,让他两碰不到一起即可

public class ArrayQueue
{
	private int maxSize ;//数组长度
	private int front ;//用来记录删到哪儿了的索引
	private int rear ;//用来记录添加到哪儿了的索引
	private int [] arr ;
	
	public ArrayQueue ( int maxSize ) 
	{
		this.maxSize = maxSize ;
		arr = new int [ maxSize ] ;
		front = -1 ;
		rear = -1 ;
	}
	
	//入队
	public void add ( int data )
	{
		if ( isFull () )
		{
			System.out.println ( "队列满了" );
			return ;
		}
		
		/*	+1:是为了让rear索引指向下一个数组空间
		 * 	% 是取余,实现循环数组的关键
		 */
		rear = (rear+1) % maxSize ;
		
		arr [rear] = data ;
	}
	
	//出队
	public void delete ()
	{
		if ( isEmpty () )
		{
			System.out.println ( "队列为空" );
			return ;
		}
		
		front = (front+1) % maxSize ;
		System.out.println ( "delete:" + arr [front] );
		arr [front] = 0 ;
	}
	
	//判断是否满了
	public boolean isFull () 
	{
		return (rear+1) % maxSize == front ;
	}
	
	//判断是否为空
	public boolean isEmpty ()
	{
		return front == rear ;
	}
	
	//遍历
	public void display ()
	{
		for ( int i = 0 ; i < maxSize ; ++i )
		{
			System.out.print ( arr [i] + " " );
		}
		System.out.println ();
	}
			
}

我的代码还是有点问题的,就是如果你一直插数据,不进行删除操作:

插入方法的判断失效,即队列满了后,回头插入新数据时,不进行判断,会直接覆盖上去


上测试结果:

ArrayQueue aq = new ArrayQueue (6) ;

		
		//不进行delete
		aq.add ( 1 );
		aq.add ( 2 );
		aq.add ( 3 );
		aq.add ( 4 );
		aq.add ( 5 );
		aq.add ( 6 );
		aq.add (7) ;
		aq.display ();

结果:
7 2 3 4 5 6 
有问题

	aq.add ( 1 );
		aq.add ( 2 );
		aq.add ( 3 );
		aq.delete ();
		aq.delete ();
		aq.add ( 4 );
		aq.add ( 5 );
		aq.add ( 6 );
		aq.add ( 7 ) ;
		aq.display ();

结果:
delete:1
delete:2
7 0 3 4 5 6 
进行删除操作后,一切正常
注意:那个0是执行删除操作后直接赋为0的


能力有限,没想出解决方案。。。

想出的话会回来更新的。。。敲打



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章