使用动态数组作为容器的栈与简单功能的实现

栈是一种存储数据的简单数据结构.类比于生活中的刷盘子,洗干净的盘子一个个堆起来,就是压栈(入栈).如果使用的时候,从顶端拿走,就是弹栈(出栈).

栈是一个有序线性表,只能在表的一端进行增加删除操作.先插入的元素最后才能删除,所以栈是先进后出的线性表(FILO)

这次我用了shift画直线,嘻嘻.

直接上实现,因为栈比较简单.注释也很全了.

package com.relic.data.structures.stack;

import java.util.EmptyStackException;

/**
 * @author Relic
 * @desc 实现简单栈与方法
 * @date 2019-09-30 14:40
 */
public class MyStack<E> {

    /**
     * 栈中的实际容器 Array数组
     */
    private Object[] elements;
    /**
     * 记录栈中的元素个数
     */
    private int elementCount;

    /**
     * 默认给定10的容量
     */
    public MyStack() {
        this(10);
    }


    public MyStack(int initCapacity) {
        elements = new Object[initCapacity];
    }

    /**
     * 压栈方法(入栈)
     *
     * @param element 需要压入栈的元素
     */
    public void push(E element) {
        //确保容量,不够就扩容
        ensureCapacity();
        //赋值给数组的指定下标,然后元素数量+1
        elements[elementCount++] = element;
    }

    /**
     * 弹栈方法(出栈)
     *
     * @return 出栈的元素
     */
    public E pop() {
        //获取栈顶元素
        E element = peek();
        //讲栈顶元素置为空,gc回收
        elements[elementCount] = null;
        elementCount--;
        return element;
    }

    /**
     * 判断栈是否为空
     *
     * @return 布尔值
     */
    public boolean empty() {
        return elementCount == 0;
    }

    /**
     * 获取栈顶元素方法,不弹出
     *
     * @return 栈顶元素
     */
    @SuppressWarnings("unchecked")
    public E peek() {
        //栈为空时抛出异常
        if (empty()) {
            throw new EmptyStackException();
        }
        return (E) elements[elementCount - 1];
    }

    /**
     * 数组扩容方法,每次为原容量的两倍
     */
    private void ensureCapacity() {
        if (elementCount >= elements.length) {
            Object[] newArray = new Object[elements.length * 2];
            System.arraycopy(elements, 0, newArray, 0, elements.length);
            elements = newArray;
        }
    }

    public static void main(String[] args) {
        MyStack<Integer> myStack = new MyStack<>();
        System.out.println(myStack.empty());
        myStack.push(1);
        System.out.println(myStack.peek());
        myStack.push(2);
        System.out.println(myStack.peek());
        System.out.println(myStack.pop());
        System.out.println(myStack.peek());
        System.out.println(myStack.empty());
    }

}

猜你喜欢

转载自blog.csdn.net/hexiaodiao/article/details/101776346