玩转数据结构之栈

2019-02-01  本文已影响0人  付凯强

0. 序言

栈是一种线性结构,相比数组, 栈对应的操作是数组的子集:只能从一端添加元素,也只能从一端取出元素,这一端为栈顶。

这篇文章会用之前的数组类Array实现一个底层为数组的栈ArrayStack。建议在阅读本篇文章之前,先阅读关于动态数组类Array这篇文章:https://www.jianshu.com/p/02bbc13b5e5f 当然对数组了解比较深入的,可以直接阅读本篇。

1. 特点

2. 应用

3. 基本实现

Stack<E>

① 从用户的角度来看,支持这些操作即可。
② 具体底层实现,用户不关心
③ 实际底层有多种实现方式。

4. 设计

基于数组的栈

定义一个ArrayStack<E>,实现接口Stack<E>。

5. 代码实现

public interface Stack<E> {
    int getSize();
    boolean isEmpty();
    void push(E e);
    E pop();
    E peek();
}
public class ArrayStack<E> implements Stack<E> {

    Array<E> array;

    public ArrayStack(int capacity) {
        array = new Array<>(capacity);
    }

    public ArrayStack() {
        array = new Array<>();
    }

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

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

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

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

    @Override
    public E peek() {
        return array.getLast();
    }

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

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

基于自定义的数组类Array,实现的栈的功能,以下是测试代码:

public class Test_ArrayStack {
    public static void main(String[] args){
        ArrayStack<Integer> stack = new ArrayStack<>();
        for (int i = 0; i < 5; i++) {
            stack.push(i);
            System.out.println(stack);
        }
        stack.pop();
        System.out.println(stack);
    }
}
Stack:  [0] top
Stack:  [0, 1] top
Stack:  [0, 1, 2] top
Stack:  [0, 1, 2, 3] top
Stack:  [0, 1, 2, 3, 4] top
Stack:  [0, 1, 2, 3] top

模拟了出栈,结果证明代码正确。

6. 栈的复杂度分析

栈的复杂度分析
ArrayStack是基于动态数组实现的,所以会自动扩容和缩容。其中入栈和出栈操作,可能会导致扩容和缩容,通过均摊复杂度分析,其时间复杂度为O(1)。
对均摊复杂度分析不了解的,可以跳转阅读:https://www.jianshu.com/p/59f380c6ffcd

7. 后续

如果大家喜欢这篇文章,欢迎点赞!
如果想看更多 数据结构 方面的文章,欢迎关注!

上一篇下一篇

猜你喜欢

热点阅读