JAVA泛型实现队列的入队出队及循环队列

什么是泛型:泛型即泛指任何类型,允许在定义类、接口、方法时使用类型形参,这个类型形参(或叫泛型)将在声明变量、创建对象、调用方法时动态的指定(即传入实际的类型参数,也可称为类型实参)

类的泛型写法:

public class 类名<泛型名>{

        //下面定义了一个数组,当实例化这个类时,在<>尖括号内写什么类型那这个数组就是什么类型的。

        private 泛型名[] arr=(泛型名[])new Object[10];

}

泛型名一般是使用E、T表示的,也可以使用其他名字。

循环队列:

        队列要满足先进先出,后进后出

        一个队列如果不实现循环队列就会造成内存资源的浪费,当你出队后队头那里的数组不再使用但还在占用数组资源,如下图:

定义两个指针,head、end分别指向队头和队尾,队列使用数组实现,入队时让end向后移动end++,出队时让head向后移动即head++

 

 循环队列就是当队列到达队尾后,再回到队头前查看没有用到的空间对他进行复用,称为循环队列,占满后再进行扩容。

 

 

那我们怎么让end回到队头位置,我们不能让end=0,我们只需要让它和数组的长度length求余,就可以回到队头位置,当end-head=数组长度时说明我们需要扩容了,如下图:

扩容时我们需要注意,怎么让旧数组放入新数组里,如下图:

我们需要让复用的元素放在新数组后,开始位置应该和求数组开始位置一致。 

出队时,如果到队尾我们需要需要用head==end判定,让出队方法停止。

用int类型的数组写一个Queue队列类代码如下:

public class Queue{
    //定义只能本类方法访问的int型数组
	private int[] arr=new int[10];
    //定义队头指针
	private int head;
    //定义队尾指针
	private int end;
    //入队方法
	public void push(int val) {
        //如果队尾和队头指针相差一个数组长度,进行扩容
		if((end-head)==arr.length) {
            //定义新数组
			int[] brr=new int[arr.length*2];
            //循环从队头指针索引处开始
			for(int i=head;i<end;i++) {
                //i%brr.length是为了防止新数组长度不够,要进入循环队列前方,
                //i%arr.length是为了把循环队列复用的数组放入新数组内
				brr[i%brr.length]=arr[i%arr.length];
			}
            //把扩容的新数组值传递给原数组
			arr=brr;
		}
        //end % arr.length实现循环队列
		arr[end % arr.length]=val;打印出队元素
		end++;
	}
    //出队方法
	public void pop() {
        //当head头指针移动到end尾指针位置时到达队尾,直接让方法出栈
		if(head==end) {
			return;
		}
        //
		System.out.println(arr[head%arr.length]);
		head++;
	}
}

上面使用的是int数组,那我们用string类型或浮点型的都会报错,我们可以使用泛型,代码如下:

public class Queue<T>{
	private T[] arr=(T[]) new Object[10];
	private int head;
	private int end;
	public void push(T val) {
		if((end-head)==arr.length) {
			T[] brr=(T[]) new Object[arr.length*2];
			for(int i=head;i<end;i++) {
				brr[i%brr.length]=arr[i%arr.length];
			}
			arr=brr;
		}
		arr[end % arr.length]=val;
		end++;
	}
	public void pop() {
		if(head==end) {
			return;
		}
		System.out.println(arr[head%arr.length]);
		head++;
	}
}

test类用string类型进行测试(我们知道数组只能放一种类型的数据,所以我们push只能放字符串类型的):

public class Demo {
	public static void main(String[] args) {
		Queue<String> queue=new Queue();
		queue.push("1");
		queue.push("1");
		queue.push("1");
		queue.push("1");
		queue.push("1");
		queue.push("1");
		queue.push("1");
		queue.push("1");
		queue.push("3");
		queue.pop();
		queue.pop();
		queue.pop();
		queue.push("2");
		queue.push("2");
		queue.push("2");
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
		queue.pop();
	}
}

结果如下:

 这样我们就可以改变<>尖括号内的泛型的类型来实现队列想放入什么类型就放入什么类型的数据了

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sshm_666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值