泛型动态栈的实现——Java

栈的功能

将栈的基本功能定义在接口中,使栈类实现接口即可。

public interface Stack<E> {
    int getSize();//存储了多少数据
    boolean isEmpty();
    void push(E e);//顶部放入元素
    E pop();//取出并返回顶部元素
    E peek();//返回顶部元素
}

栈的实现

在动态泛型数组Array类基础上实现。

Array类:

/*
动态泛型数组 支持所有类元素的存储
 */
public class Array<E> {//数组中使用类型E 泛型
    private int size;
    private E[] datas;

    //构造函数,capacity初始容量,默认为2
    public Array(int capacity){
        //datas=new E[capacity];//E类型不能直接new
        datas=(E[])new Object[capacity];//java中E[]不能直接new,由Object转化转化为E[]子类
    }
    public Array(){
        datas=(E[])new Object[2];
    }

    //查看数据数量
    public int getSize(){
        return size;
    }
    //查看是否为空
    public boolean isEmpty(){
        return (size==0);
    }
    //查看数组内容
    @Override//表示覆盖父类函数
    public String toString(){
        StringBuilder str=new StringBuilder();//StringBuilder的使用
        str.append("capacity:"+datas.length+"\nsize:"+size+"\ndatas:");
        for(int i=0;i<size;i++)
            str.append(datas[i]+"\t");
        return str.toString();
    }
    //根据下标查看数据
    public E get(int index){
        if(index<0||index>=size){
            throw new IllegalArgumentException("Get Failed.Index is illegal");
        }
        return datas[index];
    }
    //查看最后一个数据
    public E getLast(){
        return get(size-1);
    }
    //查看第一个数据
    public E getFirst(){
        return get(0);
    }
    //根据下标修改元素
    public boolean set(int index,E data){
        if(index<0||index>=size)
            return false;
        else{
            datas[index]=data;
            return true;
        }
    }

    //删除指定位置数据并返回值
    public E remove(int index){
        if(index<0||index>=size)
            throw new IllegalArgumentException("请求不合法,Array.remove(int index)操作失败");
        E ret=datas[index];
        for(int i=index;i<size-1;i++){
            datas[i]=datas[i+1];
        }
        size--;
        datas[size]=null;//置为空才能进行垃圾回收 lolitering objects闲逛元素
        return ret;
    }
    //删除最后一个元素并返回值
    public E remove(){
        return remove(size-1);
    }
    //根据数值获得索引
    public int find(E data){
        for(int i=0;i<size;i++){
            if(datas[i].equals(data))//类元素相等用equals,值比较
                return i;
        }
        return -1;//-1下标无效
    }
    //获取容量
    public int getCapacity(){
        return datas.length;
    }
    //增加元素
    public void add(E data){
        if(size==datas.length){//此元素将放入size处
            E[] newDatas=(E[])new Object[datas.length*2];
            System.arraycopy(datas,0,newDatas,0,datas.length);
            newDatas[size++]=data;
            datas=newDatas;
        }
        else {
            datas[size++] = data;
        }
    }
}

ArrayStack类:

public class ArrayStack<E> implements Stack<E> {
    Array<E> array;

    public ArrayStack(int capacity){//泛型类构造函数类名后不加<>
        array=new Array<E>(capacity);
    }
    public ArrayStack(){
        array=new Array<E>();
    }

    @Override
    public int getSize(){
        return array.getSize();
    }

    @Override
    public boolean isEmpty(){
        return array.isEmpty();
    }

    @Override
    public void push(E e){
        array.add(e);
    }

    @Override
    public E pop(){
        return array.remove();
    }

    @Override
    public E peek(){
        return array.getLast();
    }//已经在接口中定义的函数

    public int getCapacity(){
        return array.getCapacity();
    }//未曾在接口中定义的函数
}

简单测试:

public class TeatArrayStack {
    public static void main(String[] args){
        ArrayStack<String> as=new ArrayStack<>(2);//定义初始容量为2的栈
        for(int i=0;i<6;i++){
            as.push("a"+i);
            System.out.print(as.peek()+"\t");
        }//依次放入a0-a5字符串
        System.out.println();
        for(int i=0;i<6;i++){
            System.out.print(as.pop()+"\t");
        }//从顶部取5次数据
    }
}
发布了14 篇原创文章 · 获赞 0 · 访问量 300

猜你喜欢

转载自blog.csdn.net/zmx1952822326/article/details/104114241