用数组实现支持泛型的栈,支持动态扩容

       涉及到的知识点:

1.如何定义泛型类和泛型函数

2.如何抛出异常

3.如何定义支持泛型的数组

4.数组如何扩容,假设有int[] arrInt1=new Int[10]; 和int[] arrInt2=new int[20]; 可以直接arrInt1=arrInt2; 吗?

5.反射,动态建立泛型数组


关于泛型,推荐看下这篇博客。因为对于栈来说,如果在栈中没有元素时还调用pop()的话,应该抛出一个异常,如何定义一个抛出异常的函数?参看这篇博客。下面是具体实现:

import java.lang.reflect.Array;

public class ArrStack<T> {

	public static int CAPCITY = 10;//默认容量为10
	public int depth = 0;//0表示栈为空
	public T[] arr;//数组
	Class<T> type;//接收类型信息

	public ArrStack(Class<T> type) {
		this(type, CAPCITY);
	}

	@SuppressWarnings("unchecked")
	public ArrStack(Class<T> type, int cap) {
		ArrStack.CAPCITY = cap;
		this.type = type;
		arr = (T[]) Array.newInstance(type, cap);
	}

	public void push(T value) {
		if (depth + 1 == CAPCITY) {//栈满则扩容,容量为原来的两倍
			@SuppressWarnings("unchecked")
			T[] tempArr = (T[]) Array.newInstance(type, 2 * CAPCITY);
			CAPCITY = 2 * CAPCITY;
			for (int i = 0; i < arr.length; i++)
				tempArr[i] = arr[i];
			arr = tempArr;
		}
		arr[++depth] = value;
	}

	public T pop() throws Exception {// 此处最好不用抛出异常,这是由程序逻辑引起的,在pop的时候判断depth即可避免
		if (depth > 0)
			return arr[depth--];
		throw new Exception("空栈");
	}

	public int getSize() {//返回当前栈深
		return depth;
	}
}
有考虑不周的地方欢迎指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值