概述

栈是一种操作受限的线性表,其限制是指仅允许在一端进行插入和删除操作。按照先进后出(First In Last Out )的原则存储数据,堆栈类似羽毛球筒,如果我们取羽毛球打开盖子取第一个羽毛球,往羽毛球同存放羽毛球也只能一个个往里放。
image.png

概念 说明
栈顶 允许进行插入和删除操作的一段被称为栈顶,栈的入口、出口的都是栈的顶端位置。
栈底 无法进行数据操作的一端被称为栈底
压栈/push 就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
出栈/pop 就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

栈ADT

  1. public interface Stack<E> {
  2. int getSize();
  3. boolean isEmpty();
  4. void push(E e);
  5. E pop();
  6. E peek();
  7. }
  1. @Override
  2. public int size() {
  3. return top;
  4. }
  5. @Override
  6. public boolean isEmpty() {
  7. return top==0;
  8. }
  9. @Override
  10. /**
  11. * 压栈
  12. */
  13. public void push(Item e) {
  14. if (size()== stack.length){
  15. expandCapacity();
  16. }
  17. stack[top]=e;
  18. top++;
  19. }
  20. /**
  21. * 栈扩容
  22. */
  23. private void expandCapacity(){
  24. stack = Arrays.copyOf(stack,stack.length*2);
  25. }
  26. @Override
  27. /**
  28. * 出栈 返回当前栈顶元素
  29. */
  30. public Item pop() {
  31. if (isEmpty())
  32. throw new EmptyStackException();
  33. top--;
  34. Item item = stack[top];
  35. return item;
  36. }
  37. @Override
  38. public Item peek() {
  39. if (isEmpty())
  40. throw new EmptyStackException();
  41. return stack[top-1];
  42. }

数组实现

import java.util.ArrayList;

public class ArrayStack<E> implements Stack<E> {

    private ArrayList<E> list;
    public ArrayStack(){
        list = new ArrayList<E>();
    }

    @Override
    public int getSize() {
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public void push(E e) {
        list.add(list.size(),e);
    }

    @Override
    public E pop() {
        if (!isEmpty()){
            return list.remove(list.size()-1);
        }
        return null;
    }

    @Override
    public E Peek() {
        if (!isEmpty()){
            return list.get(list.size()-1);
        }
        return null;
    }

    @Override
    public String toString(){
       return list.toString();
    }
}

链表实现

public class LinkedStack <Item> implements Iterator<Item> {

    private class Node{
        Item item;
        Node next;

        public Node(Item item, Node next) {
            this.item = item;
            this.next = next;
        }
    }
    private Node first;//栈顶元素
    private int size;//栈元素总数
    private Node currNode;

    public void push(Item item){
        first = new Node(item,first);
        currNode = first;
        size++;
    }

    public Item pop(){
        Node currFirst = first;
        first = currFirst.next;
        currNode = first;
        size--;
        return currFirst.item;
    }

    public boolean isEmpty(){
        return size==0;
    }

    public int getSize() {
        return size;
    }

    @Override
    public boolean hasNext() {
        return currNode!=null;
    }

    @Override
    public Item next() {
        Item item = currNode.item;
        currNode = currNode.next;
        return item;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}