相关文章
队列类代码实现
- 仅enQueue方法与数组是否倍增有关,其他方法都与简单数组中的队列实现相同。
- 本人对数组倍增用的不是很熟,所以犯了一些容易犯的错误,解析见注释。
- this.show()用于调试时查看内部数据
package Queue;
//仅enQueue与是否倍增有关,其他方法都与简单数组中的队列实现相同
public class DouArrayQueue {
private char[] array;
private int size;//当前数组中存储数据量
private int rear,front;
public DouArrayQueue(){
array=new char[2];//数组初始大小设为2或以上整数,如果设为1在后面%array.length时极易出错
size=0;
rear=front=0;
}
public void enQueue(char data)
{
if(size==array.length){
char[] newArray=new char[2*size];//得到倍增数组
System.arraycopy(array,rear,newArray,0,size-rear);//此时原数组已经满,说明此时rear=front
System.arraycopy(array,0,newArray,size-rear,front);//把rear右侧数据先复制到新数组,在赋值front左侧数据
array=newArray;//array指向倍增数组
rear=0;
front=size;//倍增数组中数据位置变化,所以要修改数据
}
size++;//size是数据数量,只在放入新数据使改变
array[front]=data;
front=(front+1+array.length)%array.length;//循环数组处理下标加减时一定先加数组长度,再对数组长度的求余
//this.show();//用于调试时查看内部数据
}//如果容量不足,先扩容再加入新数据,否则直接加入新数据
public char deQueue(){
if(size==0){
return '#';
}
else{
size--;
char retu=array[rear];
rear=(rear+1+array.length)%array.length;
return retu;
}
}
public char front(){
if(size==0){
return '#';
}
else{
return array[(front-1+array.length)%array.length];
}
}
public int queueSize(){
return size;
}
public boolean isEmpty(){
return (size==0);
}
/*public void show(){
System.out.println("capacity"+array.length+" size"+size+" rear"+rear+" front"+front);
System.out.println(array);//使用字符数组名输出数组
}*/
}
测试
package Queue;
public class TestArrayQueue {
public static void main(String[] args){
DouArrayQueue q1=new DouArrayQueue();
q1.enQueue('1');
q1.enQueue('2');
q1.enQueue('3');
q1.enQueue('4');
q1.enQueue('5');
q1.enQueue('6');
System.out.println("队头:"+q1.front());
for(int i=0;i<10;i++){
System.out.print("队尾取出"+q1.deQueue());
}
}
}
运行结果:
队头:6
队尾取出1队尾取出2队尾取出3队尾取出4队尾取出5队尾取出6队尾取出#队尾取出#队尾取出#队尾取出#