import java.util.EmptyStackException;
public class ArrayStack<T> implements Cloneable
{
private T[] data;
private int manyItems;
// 默认构造函数
public ArrayStack()
{
final int INITIAL_CAPACITY = 10;
manyItems = 0;
data = (T[]) new Object[INITIAL_CAPACITY];
}
public ArrayStack(int initialCapacity)
{
manyItems = 0;
data = (T[]) new Object[initialCapacity];
}
// 生成栈的一个副本
public ArrayStack<T> clone()
{
ArrayStack<T> answer;
try
{
answer = (ArrayStack<T>)super.clone();
} catch (CloneNotSupportedException e)
{
throw new RuntimeException("this class does not implement Cloneable.");
}
answer.data = data.clone();
return answer;
}
// 改变栈当前的容量
public void ensureCapacity(int minimumCapacity)
{
T[] newArr;
if (data.length < minimumCapacity)
{
newArr = (T[])new Object[minimumCapacity];
System.arraycopy(data, 0, newArr, 0, manyItems);
data = newArr;
}
}
// 存取方法,用于确定栈的当前容量。
public int getCapacity()
{
return data.length;
}
// 判断是否为空
public boolean isEmpty()
{
return (manyItems == 0);
}
// 在不移除栈顶元素的情况下,获得栈顶数据项的值
public T peek()
{
if (manyItems == 0)
{
throw new EmptyStackException();
}
return data[manyItems -1];
}
// 获得栈顶数据项,并将其从栈中移出
public T pop()
{
if (manyItems == 0)
{
throw new EmptyStackException();
}
// 获得栈顶项
T answer = data[manyItems - 1];
manyItems = manyItems - 1;
data[manyItems] = null;
return answer;
}
// 将一个数据项压入栈中,新的数据项可以是空引用
public void push(T item)
{
if (data.length == manyItems)
{
ensureCapacity(manyItems*2 + 1);
}
data[manyItems] = item;
manyItems++;
}
// 用于确定栈中数据项个数的存取方法
public int size()
{
return manyItems;
}
public void trimToSize()
{
T trimmedArray[];
if (data.length == manyItems)
{
trimmedArray = (T[]) new Object[manyItems];
System.arraycopy(data, 0, trimmedArray, 0, manyItems);
data = trimmedArray;
}
}
}
【数据结构】栈的数组实现
最新推荐文章于 2020-01-02 16:06:32 发布