栈遵循先入后出原则,只能在线性表的一端添加和删除元素。我们可以把栈看做一个杯子,杯子只有一个口进出,最低处的元素只能等到上面的元素离开杯子后,才能离开。
向栈中插入一个元素时,称为入栈(压栈),移除栈顶元素称为出栈,我们需要尝试实现以下抽象类型:
/**
* 抽象类型栈,待实现
* @param <E> 元素类型
*/
public abstract class AbstractStack<E> {
/**
* 出栈操作
* @return 栈顶元素
*/
public abstract E pop();
/**
* 入栈操作
* @param e 元素
*/
public abstract void push(E e);
}
其实,我们的JVM在处理方法调用时,也是一个栈操作:
栈的深度是有限制的,如果达到限制,将会出现StackOverflowError错误(注意是错误!说明是JVM出现了问题)
/**
* 抽象类型栈,待实现
* @param <E> 元素类型
*/
public abstract class Stack<E> {
/**
* 出栈操作
* @return 栈顶元素
*/
public abstract E pop();
/**
* 入栈操作
* @param e 元素
*/
public abstract void push(E e);
}
class MyStack<E> extends Stack<E> {
private Object[] e;
private final Integer MAX_SIZE = 512;
public MyStack(){
this.e = new Object[MAX_SIZE];
top = 0;
}
private Integer top = 0;
@Override
public E pop() {
if(top <= 0) {
System.out.println("Empty Stack");
return null;
}
return (E) this.e[top--];
}
@Override
public void push(E e) {
if(top >= 512){
System.out.println("Stack Full");
return;
}
this.e[++top] = e;
}
}