「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
摘要
前几期探究过动态数组或者链表后,接下来的栈就可以使用线性表的结构再次封装实现。在实现栈 的时候发现,在线性表的基础上,实现起来更简单。
栈这种数据结构应用到很多场景,比如网页之间的跳转等。
栈的定义
栈是一种特殊的线性表,只能在一端进行操作。栈的主要特点有以下几点:
- 往栈中添加元素的操作,叫作入栈(push)
- 从栈中移除元素的操作,叫做出栈(pop) ,只能移除栈顶元素
- 栈遵守的是原则是后进先出(Last In First Out,LIFO)
栈的接口设计
根据栈的特点,可以设计栈的相关接口:
| 函数 | 释义 |
|---|---|
int size(); | 元素的数量 |
boolean isEmpty(); | 是否为空 |
void push(E element); | 入栈 |
E pop(); | 出栈 |
E top(); | 获取栈顶元素 |
void clear(); | 清空 |
- E 为泛型类型
栈的内部实现可以用动态数组或者链表。
栈的代码实现
这里先创建一个类,使用 E 作为范型,然后用 ArrayList 类型创建一个 list 数组,存放数据
public class Stack<E> {
private List<E> list = new ArrayList<>();
// 其他代码内容
....
}
元素的数量就可以访问 list 对象的 size() 获取到:
int size() {
return list.size();
}
同时判断数组是否为空的处理,也可以访问 list 的 isEmpty() 实现:
boolean isEmpty() {
return list.isEmpty();
}
接下来,实现入栈的方法,因为入栈是将元素放在数组的尾部,所以可以直接使用 list 的 add() 方法:
void push(E element) {
list.add(element);
}
出栈就是移除栈顶的元素,也就是数组中的最后一个元素,所以使用 list 的 remove 方法移除最后一个元素。list 的 size() 可以获取到数组的数量,所以减去 1 就能得到数组中的最后一个元素。
E pop() {
return list.remove(list.size() -1);
}
获取栈顶元素也就是直接获取到数组的最后一个元素:
E top() {
return list.get(list.size() -1);
}
最后清空的方法也是直接使用 list 的 clear() 方法:
void clear() {
list.clear();
}
整体实现完成,发现栈就是对数组的封装处理,这样看来,栈的结构也是非常简单的,这里使用到数组相关的很多方法处理,所以对数组的结构不是很清晰,可以看往期介绍的动态数组。