数据结构与算法-基础(四)栈(Stack)

935 阅读2分钟

「这是我参与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();
}

同时判断数组是否为空的处理,也可以访问 listisEmpty() 实现:

boolean isEmpty()  {
  return list.isEmpty();
}

接下来,实现入栈的方法,因为入栈是将元素放在数组的尾部,所以可以直接使用 listadd() 方法:

void push(E element) {
  list.add(element);
}

出栈就是移除栈顶的元素,也就是数组中的最后一个元素,所以使用 listremove 方法移除最后一个元素。listsize() 可以获取到数组的数量,所以减去 1 就能得到数组中的最后一个元素。

E pop() {
  return list.remove(list.size() -1);
}

获取栈顶元素也就是直接获取到数组的最后一个元素:

E top() {
  return list.get(list.size() -1);
}

最后清空的方法也是直接使用 listclear() 方法:

void clear() {
  list.clear();
}

整体实现完成,发现就是对数组的封装处理,这样看来,栈的结构也是非常简单的,这里使用到数组相关的很多方法处理,所以对数组的结构不是很清晰,可以看往期介绍的动态数组