Featured image of post 数据结构之栈

数据结构之栈

本文阅读量

https://zhuanlan.zhihu.com/p/712672052

数据结构之栈

定义

底层依赖的是静态数组实现的,靠resize来解决固定容量问题

栈是一个后进先出(Last In Fist Out, LIFO)的线性表,它要求只在表尾进行删除和插入操作。

所谓的栈,其实就是一个特殊的线性表(顺序表、链表),但是它在操作上有一些特殊的要求和限制:

  • 栈的元素必须“后进先出”
  • 栈的操作只能在这个线性表的表尾进行。
  • 对于栈来说,这个表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)。

栈的插入和删除操作:

栈的插入操作(Push),叫做进栈,也称为压栈,入栈。

栈的删除操作(Pop),叫做出栈,也称为弹栈。

因为栈的本质是一个线性表,线性表有两种存储形式,那么栈也分为栈的顺序存储结构和栈的连式存储结构。

栈的存储结构

顺序存储结构

链式存储结构

实现

定义栈的接口

1
2
3
4
5
6
7
public interface Stack<E>{
    int getSize();
    boolean isEmpty();
    void push(E e);
    E pop();
    E peek();
}

基于数组实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class ArrayStack<E> implements Stack<E> {
    private Array<E> data;
    public ArrayStack(int capacity) {
        data = new Array<>(capacity);
    }
    public ArrayStack() {
        data = new Array<>();
    }
    @Override
    public int getSize() {
        return data.getSize();
    }

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

    @Override
    public void push(E e) {
        data.addLast(e);
    }

    @Override
    public E pop() {
        return data.removeLast();
    }

    @Override
    public E peek() {
        return data.get(data.getSize() - 1);
    }

    public int getCapacity(){
        return data.getCapacity();
    }

    @Override
    public String toString() {
        StringBuilder strObj = new StringBuilder();
        strObj.append("Stack: [");
        for (int i = 0; i < data.getSize(); i++) {
            strObj.append(data.get(i));
            if(i!=data.getSize()-1){
                strObj.append(", ");
            }
        }
        strObj.append("] Top");
        return strObj.toString();
    }
}

应用

编辑器undo操作

系统调用栈

括号匹配

使用 Hugo 构建
主题 StackJimmy 设计