自定义数组栈——ArrayStack的实现(Java)

我们定义一个名为ArrayStack的类来表示一个基于数组实现的栈,该栈存储的是范型T的对象
栈的数组实现可以通过以下4个假设来设计:
1.该数组是一个对象引用的数组(该数据类型在栈实例化时确定);
2.栈底总是在数组的索引0处;
3.栈的元素是按顺序并连续地存储在数组中;
4.有一个整数变量top,该变量保存了紧跟栈顶元素后的数组索引号。

(该类的创造来自于《Java软件结构与数据结构第四版》教材上的案例)
这个习题给了我很多新的思考,包括这个类中的两个构造方法,用的很好,是方法重载的一个极好展示(用户无论设置栈长否,我们都能给出相应的反映)

其次stack = (T[])(new Object[DEFINE_LONG])用的也十分巧妙,通过泛型的学习,我们知道不能实例化一个泛型对象。这意味着不能实例化任何泛型数组。而该行实例化了一个Object数组,然后把它转换成一个泛型数组.这里可能将产生一个未检验类型转换的编译时警告。但是为了获得灵活性和泛型的安全性,产生这种警告也是值得的。在语句前使用如下Java注释,可以禁止这种警告:

@suppressWarnings("uncheched")

最后,我觉得他的expandCapacity()方法用的也很巧妙,我们知道用数组做存储的最大缺点就是不能实时的变化长度,一旦固定长度,就不容易再改动,而这个方法就保证了数组栈能够在栈满的情况下,再变长为原来的二倍,只要内存连续空间足够,栈就不会满,然而这一操作用户是不可见的,该方法的权限为私有,也更好的体现了面向对象的封装特点,很值得思考和学习。

定义接口

package 数组结构_栈;

public interface StackADT<T> {
	//压栈
	public void push(T element);
	//弹栈
	public T pop();
	//展示栈顶元素
	public T peek();
	//判断是否栈空
	public boolean isEmpty();
	//反馈栈长
	public int size();
	//显示栈
	public String toString();
}

接口实现类

package 数组结构_栈;

import java.util.Arrays;

public class ArrayStack<T> implements StackADT<T> {
	private int DEFINE_LONG = 100;
	private int top;
	private T[] stack;
	//构造函数一(用户不指定栈长)
	public ArrayStack() {
		top = 0;
		stack = (T[])(new Object[DEFINE_LONG]);
	}
	//构造函数二(用户指定栈长)
	public ArrayStack(int initialCapacity) {
		top = 0;
		stack = (T[])(new Object[initialCapacity]);
	}
	
	//压栈方法
	@Override
	public void push(T element) {
		//若栈满调用方法增加长度
		if(size() == stack.length)
			 expandCapacity();
		stack[top] = element;
		top++;
	}
	//数组增长方法
	private void expandCapacity() {
		stack = Arrays.copyOf(stack, stack.length*2);
	}
	
	//弹栈方法
	@Override
	public T pop() throws EmptyCollectionException{
		if(isEmpty())
			throw new EmptyCollectionException("stack");
		top--;
		T temp = stack[top];
		stack[top] = null;
		return temp;
	}

	//查看栈顶元素方法
	@Override
	public T peek() {
		if(isEmpty())
			throw new EmptyCollectionException("stack");
		return stack[top-1];
	}

	//判断栈空方法
	@Override
	public boolean isEmpty() {
		if(stack[top] == null && top == 0)
			return true;
		else
			return false;
	}

	//查看栈元素长度方法
	@Override
	public int size() {
		return top;
	}
}
//新异常定义
class EmptyCollectionException extends RuntimeException{
	public EmptyCollectionException(String collection) {
		super("The "+ collection +" is empty");
	}
}

你可能感兴趣的:(数据结构)