关注公众号: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每日刷。
加油!
拜了个拜!嘿嘿嘿……