1. 什么是栈(Stack
)
栈是一种数据结构。要说明栈的定义,我们需要从栈的特性说起,只要符合这种特性的数据结构就可以叫做栈。
下面我们来看看栈的特性是什么。
栈的特性是存入栈中的元素先进后出。先进后出是什么意思呢?
我们考虑有一个桶,桶有5
层,每层只能放一个球,并且只有桶的最上面有个开口用来放球和拿球。
现在假设我们有三个球叫A
,B
,C
,桶也是空的。
我们按照A,B,C的先后顺序把球放进桶里,那么此时的桶里面的球的排布如下:
第五层 | |
第四层 | |
第三层 | C |
第二层 | B |
第一层 | A |
此时我们再从桶里逐一把球拿出来。首先只能拿C
球,把C
球拿掉后才能拿B
球,然后才是A
球。
根据以上场景,我们可以知道放球顺序是A
,B
,C
;拿球顺序是C
,B
,A
。
即前面所说的栈的特性:先进后出,并且栈只提供栈顶供我们放元素和取元素。
2. java实现
栈可以通过链表实现,也可以通过数组实现。
背刺选择双链表作为实现栈的载体。
关于链表以及双链表的实现,可以参考以前的文章:
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;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。