数组实现循环队列

用数组实现循环队列

实现队列接口

package ArrayQueue;

public interface Queue<E> {
   //1、入队
	void enqueue(E e);
	//2、出队
	E dequeue();
	//3、查询队首元素
	E getFront();
	//4、查询队尾元素
	E getRear();
	//5、查询队列存放多少个元素的个数
	int getSize();
	//6、查询队列是否为空
	boolean isEmpty();
}

实现队列方法(以进行对个你10个空间,存放10个元素进行改正)

package ArrayQueue;

public class LoopQueue<E>implements Queue<E> {
    E[]array;
    int front,rear,size;
    //初始化数组
	public LoopQueue(int capacity) {
		array=(E[])new Object[capacity+1];
		front =0;
		rear =0;
		size=0;
	}
	public LoopQueue() {
		this(8);
	}
//	获取队列的容量 >方便一下阔容
	public int getCapacity() {
		// TODO Auto-generated method stub
		return array.length-1;
	}
//	扩容
	private void resize(int newCapacity) {
		/*
		 * 扩容要做事,新键数组,数组迭代更换;同时跟新头部和尾部
		 */
		E []newArray=(E[])new Object[newCapacity+1];
		for(int i=0;i<size;i++) {
			newArray[i]=array[(i+front)%array.length];
		}
		array=newArray;
		front =0;  //同时更新一下头部为0
		rear=size; //尾部为size;
		
	}
//   入队  
	@Override
	public void enqueue(E e) {
		// TODO Auto-generated method stub
//	如果队尾+1等于头部 证明队列为满 需要扩容
		if((rear+1)%array.length==front) {
			resize(getCapacity()*2);
		}
//		增加元素
		array[rear]=e;
//		维护rear ,size
		rear =(rear+1)%array.length;
		size++;
		
	}
	@Override
	public E dequeue() {
		// TODO Auto-generated method stub
		if(isEmpty()) {
			throw new IllegalArgumentException("no elements");
		}
//		将待出队的队首元素存放在临时变量res中
		E res=array[front];
		array[front]=null;
		front=(front+1)%array.length;
		size--;
		if(size==getCapacity()/4&&getCapacity()/2!=0) {
			resize(getCapacity()/2);
		}
		return res;
	}
	@Override
	public E getFront() {
		// TODO Auto-generated method stub
		return array[front];
	}
//  查询队尾元素
	@Override
	public E getRear() {
		// TODO Auto-generated method stub
		return array[rear];
	}
//  查询队列总元素个数
	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return size;
	}
//  查询队列是否为空
	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return front==rear;
	}
	
	//重写toString
	@Override
	public String toString() {
	StringBuilder res=new StringBuilder();
	res.append(String.format("LoopQueue:size=%d,capacity=%d", size,getCapacity()));
	res.append("\nfront[");
	//遍历队列 重新调整队列
	for(int i=front;i!=rear;i=(i+1)%array.length) {
		res.append(array[i]);
		if(i!=rear-1) {
			res.append(",");
		}
	}
	res.append("]rear");
	return res.toString();
		
	}
}

测试

package ArrayQueue;

import java.util.Random;

public class LoopQueueTest {
public static void main(String[] args) {
	LoopQueue<Integer> q=new LoopQueue<Integer>();
	for(int i=1;i<=8;i++) {
		q.enqueue(i);
	}
	System.out.println(q);
	System.out.println("查询队列是否为空:"+q.isEmpty());
    System.out.println("队列总元素:"+q.getSize());
    System.out.println("队列总容量:"+q.getCapacity());
    System.out.println("查询队首元素:"+q.getFront());
  
    /*
	  int opCount = 100000;
	  LoopQueue<Integer> loopQueue = new LoopQueue<>();
      double time2 = testQueue(loopQueue, opCount);
      System.out.println("LoopQueue, time: " + time2 + " s");
      */
}
// 测试使用q运行opCount个enqueueu和dequeue操作所需要的时间,单位:秒
private static double testQueue(Queue<Integer> q, int opCount){
    long startTime = System.nanoTime();
    Random random = new Random();
    for(int i = 0 ; i < opCount ; i ++)
        q.enqueue(random.nextInt(Integer.MAX_VALUE));
    for(int i = 0 ; i < opCount ; i ++)
        q.dequeue();
    long endTime = System.nanoTime();
    return (endTime - startTime) / 1000000000.0;
    
}
}

测试效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金石不渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值