三、栈是不是很EZ

121 阅读2分钟

关注公众号:EZ大数据(ID:EZ_DATA)。每天进步一点点,感觉很爽!

各位小伙伴大家好,今天我们来看数据结构——栈。那么今天的目标有三个:认识栈、栈的应用和栈的基本实现。

那么,我们先从基础部分来看,栈呢,也是一种线性结构,相比数组,栈对应的操作是数组的子集。

栈只能从一端添加元素,也只能从一端取出元素,这一端成为栈顶。是一种后进先出的数据结构Last In First Out(LIFO)。

ok,从上面的示意图可以清晰的了解到栈的特点。接下来我们来看看栈的一些应用场景。

说起栈的应用呢,比如我们日常工作中的一个常见操作:Undo撤销。大家有没有联想起来,每次我们撤销上一次的操作,其实就是栈的一种应用,从栈顶把上一次的操作取出。

栈的应用还有一种,就是程序调用的系统栈,具体呢,来看图:

从上图可以看到系统栈的作用:在编程的时候,当进行子过程调用时,如果一个子过程完成之后,可以自动的回到上层调用中断的位置,继续执行下去。也就是说会记录每一次调用过程中中断的调用点。

好了,重点来了,我们来实现一波栈。从实际用户的角度来看,不需要关心底层如何实现,那么我们可以基于之前的动态Array来实现栈。

Stack的实现方法呢,有以下几种:

1.void push 向栈中添加一个元素

2.E pop() 删除栈顶元素

3.E peek() 查看栈顶元素

4.int getSize() 获取栈的元素个数

5.boolean isEmpty() 查看栈是否为空

具体的代码实现起来呢,也非常的简单,话不多说直接上了:

 public class ArrayStack<E> implements Stack<E> {

        Array<E> array;

        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();
        }

        @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();
        }
    }

怎么样,是不是很简单,是不是很EZ,栈就是这么滴简单。当然实践起来,一点也不容易,毕竟是让人头疼的数据结构和算法。

OJBK,关于栈的基本认知今天就到这里。后续我会从LeetCode上选择部分对应的题,来巩固自己的知识。所以新开一个专题吧:LeetCode每日刷。

加油!

拜了个拜!嘿嘿嘿……