零、前言

栈是一种线性的数据结构
特性:仅栈顶元素可见、后进先出LIFO
操作:push入栈 pop弹栈 peek查看栈顶元素

9414344-bc6446f08f573e63.png
栈.png

栈的数组实现

一、栈的接口

/**
 * 作者:张风捷特烈
 * 时间:2018/8/17 0017:12:49
 * 邮箱:1981462002@qq.com
 * 说明:栈的接口
 */
public interface IStack<T>  {
    /**
     * 栈元素个数
     * @return  栈元素个数
     */
    int size();

    /**
     * 栈元素容积
     * @return 容积
     */
    int capacity();

    /**
     * 是否为空
     * @return  是否为空
     */
    boolean isEmpty();

    /**
     * 入栈
     * @param el 元素
     */
    void push(T el);

    /**
     * 出栈
     * @return 元素
     */
    T pop();

    /**
     * 取出元素
     * @return 元素
     */
    T peek();
}

二、栈的数组实现:数组总结见第01篇

/**
 * 作者:张风捷特烈
 * 时间:2018/8/17 0017:12:56
 * 邮箱:1981462002@qq.com
 * 说明:栈的数组实现
 */
public class ArrayGroupStack<T> implements IStack<T> {
    /**
     * 成员变量
     */
    private ArrayGroup<T> array;

    public ArrayGroupStack(int capacity) {
        array = new ArrayGroup<>(capacity);
    }

    public ArrayGroupStack() {
        array = new ArrayGroup<>();
    }


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

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


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


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


    @Override
    public void push(T el) {
        array.addLast(el);
    }


    @Override
    public T peek() {
        return array.get(size() - 1);
    }

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

}
数组栈测试
private static void arrayStackTest() {
    ArrayGroupStack<Integer> arrayGroupStack = new ArrayGroupStack<>();
    for (int i = 0; i < 5; i++) {
        arrayGroupStack.push(i);
        System.out.println(arrayGroupStack);
    }
    arrayGroupStack.pop();
    arrayGroupStack.pop();
    Integer peek = arrayGroupStack.peek();
    System.out.println(peek);
}
//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
//2

三、链表实现栈 :链表总结见第02篇

/**
 * 作者:张风捷特烈
 * 时间:2018/8/17 0017:22:40
 * 邮箱:1981462002@qq.com
 * 说明:栈的链表式集合实现
 */
public class SingleLinkedStack<E> implements IStack<E> {
    
    private SingleLinkedGroup<E> mLinkedGroup;

    public SingleLinkedStack() {
        mLinkedGroup = new SingleLinkedGroup<>();
    }


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

    @Override
    public int capacity() {
        return mLinkedGroup.size();
    }

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

    @Override
    public void push(E el) {
        mLinkedGroup.addFirst(el);
    }

    @Override
    public E pop() {
        return mLinkedGroup.removeFirst();
    }

    @Override
    public E peek() {
        return mLinkedGroup.get(0);
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("SingleLinkedStack Stack :");
        res.append(mLinkedGroup);
        return res.toString();
    }
}
测试:
/**
 * 链表式集合实现的栈测试方法
 */
private static void linkStackTest() {
    SingleLinkedStack<Integer> linkedStack = new SingleLinkedStack<>();
    for (int i = 0; i < 5; i++) {
        linkedStack.push(i);
        System.out.println(linkedStack);
    }
    linkedStack.pop();
    linkedStack.pop();
    Integer peek = linkedStack.peek();
    System.out.println(peek);
    //SingleLinkedStack Stack :head: 0->NULL
    //SingleLinkedStack Stack :head: 1->0->NULL
    //SingleLinkedStack Stack :head: 2->1->0->NULL
    //SingleLinkedStack Stack :head: 3->2->1->0->NULL
    //SingleLinkedStack Stack :head: 4->3->2->1->0->NULL
    //2
}

四、链表和数组实现栈的比较

数组栈:ArrayGroupStack测试
方法\数量 复杂度 1000次 10000次 10W次 100W次 1000W次
push O(1) 0.0011秒 0.0034秒 0.0158秒 0.0726秒 1.020秒
pop O(1) 0.0006秒 0.0025秒 0.0085秒 0.0280秒 0.1751秒
peek O(1) -- -- -- -- --
链表栈:SingleLinkedStack测试

方法\数量 |复杂度 |1000次|10000次|10W次|100W次|1000W次
--- |---|---|---|---|---|---|---
push | O(1)|0.0005秒|0.0027秒|0.0075秒|0.3817秒|3.1550秒
pop| O(1)|0.0004秒|0.0022秒|0.0050秒|0.0223秒|0.1267秒
peek | O(1)|--|--|--|--|--|


后记、

1.声明:

[1]本文由张风捷特烈原创,各图均由本人亲自所画,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多数据结构知识欢迎访问:图解数据结构
项目源码均在我的https://github.com/toly1994328/DS:欢迎star
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
9414344-c474349cd3bd4b82.jpg
公众号.jpg
posted on 2018-09-22 21:26  张风捷特烈  阅读(197)  评论(0编辑  收藏  举报