* 回答:
关键点在于(front+1)% maxSize ,下面两个操作都是基于此完成的
* 让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的
想出的话会回来更新的。。。