手写栈数据结构

实现栈的思路:

 

栈是动态集合,它实现的是一种后进先出(last-in, first-out)LIFO策略。栈一般支持压入(add),弹出(delete)。一般可以用数组A作为栈底层数据内存存储,可以通过属性new A().eleNum来记录栈数量。

  每次调用弹出函数时,返回数组(eleNum -1)下标对应的值,然后将()(eleNum -1)作为新的栈数量。

  每次调用压入函数时,判断底层数组是否长度足够(new A().length < eleNum + 1),如果不够可以按照给定的算法进行扩容,返回一个包含原来元素新长度的新数组,然后再把新的元素插入到(eleNum)下标位置,最后把(eleNum + 1)作为新的栈数量。

 

 

 

实现栈代码

/**
 * <p>
 * 数据结构 - 栈 - 后进先出(LIFO last-in first-out)
 * </p>
 *
 * @author laizhiyuan
 * @since 2019/9/25.
 */
public class Stack<T> {


    private Object[] dataElement;
    private int eleNum = 0;
    private static final int DEFAULT_INIT_CAPACITY = 10;

    public Stack() {
        this.dataElement = new Object[DEFAULT_INIT_CAPACITY];
    }

    public Stack(int capacity) {
        if (capacity < 0) {
            throw new IllegalArgumentException("capacity can not than less 0");
        }
        this.dataElement = new Object[capacity];
    }

    @SuppressWarnings("unchecked")
    public T pop() {
        if (this.eleNum < 1) {
            throw new ArrayIndexOutOfBoundsException(this.eleNum - 1);
        }
        this.eleNum = this.eleNum - 1;
        Object o = this.dataElement[this.eleNum];
        this.dataElement[this.eleNum] = null;

        return (T) o;
    }

    public void push(T data) {
        if (dataElement.length < this.eleNum + 1) {
            int newLength = dataElement.length + (dataElement.length >> 1);
            this.dataElement = Arrays.copyOf(this.dataElement, newLength);
        }
        this.dataElement[this.eleNum++] = data;
    }

    public void cleanAll() {
        this.dataElement = new Object[DEFAULT_INIT_CAPACITY];
    }

    public boolean isEmpty() {
        return this.length() > 0;
    }

    public int length() {
        return this.eleNum;
    }
 }

测试栈代码​​​​​​​

public static void main(String[] args) {

        Stack<String> stack = new Stack<>();

        System.out.println(stack.length());
        System.out.println(stack.isEmpty());

        stack.push("1");
        stack.push("2");
        stack.push("3");
        stack.push("4");
        stack.push("5");
        stack.push("6");
        stack.push("7");
        stack.push("8");
        stack.push("9");
        stack.push("zhangsan");
        stack.push("lisi");
        stack.push("wangwu");

        System.out.println(stack.length());
        System.out.println(stack.isEmpty());

        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());

        System.out.println(stack.length());
        System.out.println(stack.isEmpty());

        stack.cleanAll();

        System.out.println(stack.length());
        System.out.println(stack.isEmpty());
    }

}

测试输出结果

0false12truewangwulisizhangsan9true9true

 

简单几行代码就可以实现一个栈数据结构,你get到了吗?

 

 

-END-

 

 

    长按扫码关注【Java软件编程之家】公众号,一起学习,一起成长!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值