* 與堆棧相比,棧的操作始終是一個方向,而隊列的操作在兩端
*
* 如果按照原始的方法(即不考慮空間浪費,直接插,插到底拉倒)實現隊列,那麼當一邊添加,一邊刪除時,添加到最後,rear到索引最大值(這時又不能往回插入)
* 必會造成大量空間浪費,爲了儘可能利用資源空間,採用循環數組的機制來減少浪費
*
* 使用循環數組會出現的問題:
* 1.如何實現循環數組?
* 2.實現了循環數組後,當隊列空 rear==front , 當隊列滿也是 rear==front ,那麼如何區分這兩者?
*
* 回答:
關鍵點在於(front+1)% maxSize ,下面兩個操作都是基於此完成的
* 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的
能力有限,沒想出解決方案。。。
想出的話會回來更新的。。。