设计思路
栈这种数据结构实现起来非常简单,主要有以下几个方法
- push()
- pop()
- peek()
- size()
- isEmpty()
考虑一个问题,栈算是一种操作受限的线性表,那我们为什么还要用栈,而不是直接用链表或者数组或者什么别的数据结构,反正栈内部也是用了这些数据结构实现的?
这个问题可以这么考虑:
暴露的接口越多,操作越灵活,程序就更加的
不可控
所以,使用栈的目的就是让你只关心与栈相关的代码逻辑的实现,而不去考虑一些别的,毕竟你既然选用了栈这种数据结构,就代表问题很时候用栈解决
顺序栈
这里我们基于ArrayList
来实现一个顺序栈
/**
* @Classname ArrayListStack
* @Description 顺序栈
* @Date 2019/12/14 12:39
* @Created by SunCheng
*/
public class ArrayListStack<E>{
ArrayList<E> data;
public ArrayListStack() {
data = new ArrayList<>();
}
public int size() {
return data.size();
}
public void push(E e) {
data.add(e);
}
public E pop() {
if (isEmpty()) {
throw new IllegalStateException("the stack is empty");
}
return data.remove(data.size()-1);
}
public boolean isEmpty() {
return data.isEmpty();
}
public E peek(){
return data.get(data.size() - 1);
}
}
链式栈
这里我们基于LinkedList
来实现一个链式栈
/**
* @Classname LinkedListStack
* @Description 链式栈
* @Date 2019/12/14 12:42
* @Created by SunCheng
*/
public class LinkedListStack<E> {
LinkedList<E> data;
public LinkedListStack() {
data = new LinkedList<>();
}
public int size(){
return data.size();
}
public boolean isEmpty(){
return data.isEmpty();
}
public void push(E e) {
data.addLast(e);
}
public E pop() {
return data.removeLast();
}
public E peek(){
return data.get(data.size() - 1);
}
}