栈遵循先入后出原则,只能在线性表的一端添加和删除元素。我们可以把栈看做一个杯子,杯子只有一个口进出,最低处的元素只能等到上面的元素离开杯子后,才能离开。
    image.png
    向栈中插入一个元素时,称为入栈(压栈),移除栈顶元素称为出栈,我们需要尝试实现以下抽象类型:

    1. /**
    2. * 抽象类型栈,待实现
    3. * @param <E> 元素类型
    4. */
    5. public abstract class AbstractStack<E> {
    6. /**
    7. * 出栈操作
    8. * @return 栈顶元素
    9. */
    10. public abstract E pop();
    11. /**
    12. * 入栈操作
    13. * @param e 元素
    14. */
    15. public abstract void push(E e);
    16. }

    其实,我们的JVM在处理方法调用时,也是一个栈操作:

    4-3 栈 - 图2
    栈的深度是有限制的,如果达到限制,将会出现StackOverflowError错误(注意是错误!说明是JVM出现了问题)

    1. /**
    2. * 抽象类型栈,待实现
    3. * @param <E> 元素类型
    4. */
    5. public abstract class Stack<E> {
    6. /**
    7. * 出栈操作
    8. * @return 栈顶元素
    9. */
    10. public abstract E pop();
    11. /**
    12. * 入栈操作
    13. * @param e 元素
    14. */
    15. public abstract void push(E e);
    16. }
    17. class MyStack<E> extends Stack<E> {
    18. private Object[] e;
    19. private final Integer MAX_SIZE = 512;
    20. public MyStack(){
    21. this.e = new Object[MAX_SIZE];
    22. top = 0;
    23. }
    24. private Integer top = 0;
    25. @Override
    26. public E pop() {
    27. if(top <= 0) {
    28. System.out.println("Empty Stack");
    29. return null;
    30. }
    31. return (E) this.e[top--];
    32. }
    33. @Override
    34. public void push(E e) {
    35. if(top >= 512){
    36. System.out.println("Stack Full");
    37. return;
    38. }
    39. this.e[++top] = e;
    40. }
    41. }