數據結構-循環數組實現隊列

* 隊列的特點:先進先出
 * 與堆棧相比,棧的操作始終是一個方向,而隊列的操作在兩端
 *
 * 如果按照原始的方法(即不考慮空間浪費,直接插,插到底拉倒)實現隊列,那麼當一邊添加,一邊刪除時,添加到最後,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的


能力有限,沒想出解決方案。。。

想出的話會回來更新的。。。敲打



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