循环队列的最优实现(数组实现)

循环队列

1、原理:循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成一种理解意义上的环结构,在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。
2、循环队列的实现:
首先。需要引入两个指向,来标记队首和队尾
在这里插入图片描述
(start标记队首,end标记队尾)

接下来我们就往里面添加元素(如下图所示)
在这里插入图片描述
如果要实现循环队列,当队的最后一个位置有元素,添加下个元素到队首,此时队首的位置必须的空出来才能循环起来:
在这里插入图片描述
然后依次循环下去。
在实现的过程中肯定会涉及到数组的扩容以及缩减问题,下面我来解释一下数组何时需要扩容(缩减)以及如何扩容(缩减)。
以扩容为例:再循环过程中,出现end即将要覆盖start的时候需要扩容(如下图:)
在这里插入图片描述
在这里插入图片描述
缩减原理相同。接下来我们看代码实现:

public class CilQueDemo {
	private int[] arr = new int[20];//假定数组长度为20
	private int start = 0;
	private int end = 0;

	//循环队列增加元素操作
	public void add(int a){
		arr[end % arr.length] = a; //因为考虑到队列的循环,end的值会超过数组的长度,而数组下标不能超,因此采取取余的手段
		end++;
		
		//数组扩容
		if(end - start + 1 == arr.length){
			int[] arrnew = new int[arr.length * 2];
			for(int i = 0; i < arr.length; i++){
				arrnew[i] = arr[(i + start) % arr.length];
			}
			arr = arrnew; //采用数组拷贝来扩充数组
			end = end - start;
			start = 0;//指向数组头部
		}
	}
	
	//删除操作
	public void del(){
		if(end == start){
			System.out.println("null");
			return ;
		}
		System.out.println(arr[start % arr.length]);
		start++;
		//数组缩减		
		if(end - start + 1 < arr.length/4) {
			int newlen = arr.length/2;
			if(newlen<20) {  //定义数组长度最低不少于20
				newlen = 20;
			}
			int[] arrnew = new int[newlen];
			for(int i=0;i<arrnew.length;i++) {
				arrnew[i] = arr[(start + i)%arr.length];
			}
			arr = arrnew;
			end = end - start;
			start = 0;
		}
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值