1. 什么是栈(Stack)

栈是一种数据结构。要说明栈的定义,我们需要从栈的特性说起,只要符合这种特性的数据结构就可以叫做栈。

下面我们来看看栈的特性是什么。

栈的特性是存入栈中的元素先进后出。先进后出是什么意思呢?

我们考虑有一个桶,桶有5层,每层只能放一个球,并且只有桶的最上面有个开口用来放球和拿球。

现在假设我们有三个球叫A,B,C,桶也是空的。

我们按照A,B,C的先后顺序把球放进桶里,那么此时的桶里面的球的排布如下:

第五层 | |

第四层 | |

第三层 | C |

第二层 | B |

第一层 | A |

此时我们再从桶里逐一把球拿出来。首先只能拿C球,把C球拿掉后才能拿B球,然后才是A球。

根据以上场景,我们可以知道放球顺序是A,B,C;拿球顺序是C,B,A

即前面所说的栈的特性:先进后出,并且栈只提供栈顶供我们放元素和取元素。

2. java实现

栈可以通过链表实现,也可以通过数组实现。

背刺选择双链表作为实现栈的载体。

关于链表以及双链表的实现,可以参考以前的文章:

Segment Fault

Bugkit

package org.bugkit.structure;

/**
 * @author bugkit
 * @since 2021.10.27
 */
public class LinkedList<E> extends AbstractList<E> implements List<E>, Queue<E>, Stack<E> {

    private Node<E> head;
    private Node<E> tail;

    // 创建一个空栈
    public LinkedList() {
        tail = head = null;
    }

    // 放入元素到栈中
    @Override
    public boolean push(E e) {
        Node<E> node = new Node<>(e);
        if (isEmpty()) {
            tail = head = node;
        }else{
            node.prev = tail;
            tail.next = node;
            tail = node;
        }
        size++;
        return true;
    }

    // 取出栈中的一个元素
    @Override
    public E pop() {
        if (isEmpty()) {
            throw new RuntimeException("Stack is empty");
        }
        E e = tail.e;
        if (size() == 1) {
            tail = head = null;
        }else{
            tail = tail.prev;
            tail.next = null;
        }
        size--;
        return e;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("LinkedList: { ");
        Node<E> node = head;
        while (node != null) {
            sb.append(node.e).append("<->");
            node = node.next;
        }
        sb.append("null }");
        return sb.toString();
    }

    private static class Node<E> {

        E e;

        Node<E> next;
        Node<E> prev;

        public Node(E e) {
            this.e = e;
        }
    }

}

benntty74
49 声望0 粉丝

小透明