栈是一种存储数据的简单数据结构.类比于生活中的刷盘子,洗干净的盘子一个个堆起来,就是压栈(入栈).如果使用的时候,从顶端拿走,就是弹栈(出栈).
栈是一个有序线性表,只能在表的一端进行增加删除操作.先插入的元素最后才能删除,所以栈是先进后出的线性表(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());
}
}