栈的简单介绍
线性表
- 定义
线性表是具有相同特性数据元素的一个有限序列,
该序列中所含元素的个数叫做线性表的长度。
- 逻辑特性
只有一个表头元素、没有前驱,只有一个表尾元素,没有后继。除表头和表尾外,其他元素只有一个直接前驱,也只有一个直接后继。 - 存储结构
可以是顺序存储结构 也可以是链式存储结构。
栈
- 栈的定义
栈是一种只能在一端进行插入或删除的 操作受限的 线性表 。
- 栈的特点
FILO - 栈的数学性质
当n个元素以某种顺序进栈,并且可以在任意时刻出栈时,所获得的元素排列的数目N恰好满足函数Catalan()的计算即 图来自这里->贴个链接
栈的实现
自己实现
顺序映像
import java.util.EmptyStackException;
public class MyStack<E> {
private static final int DEFAULT_CAPACITY = 10;
private static final int MAX_CAPACITY = Integer.MAX_VALUE-8;
//属性
private E[] list;
private int top = -1;
//构造方法
public MyStack(){
list = (E[])new Object[DEFAULT_CAPACITY];
}
public MyStack(int initialCapacity){
checkCapacity(initialCapacity);
list = (E[])new Object[initialCapacity];
}
private void checkCapacity(int initialCapacity) {
if(initialCapacity <0 || initialCapacity> MAX_CAPACITY){
throw new IllegalArgumentException("initialCapacity = "+ initialCapacity );
}
}
//方法
public void push(E e){
if(top==list.length-1){
//如果需要扩容
int newLength = calculateCapacity();
grow(newLength);
}
list[++top] =e;
}
//计算容量
private int calculateCapacity(){
if(list.length ==MAX_CAPACITY) throw new RuntimeException("too long");
int newLength = list.length+(list.length>>1);
if(newLength<0 ||newLength>MAX_CAPACITY){
newLength = MAX_CAPACITY;
}
return newLength;
}
private void grow(int newLength){
E[] tempList = (E[])new Object[newLength];
for (int i = 0; i <top ; i++) {
tempList[i] = list[i];
}
list = tempList;
}
public E pop(