Stack(栈)
Stack(栈)是一种特殊的线性表,它只允许在栈顶(top)进行增删操作。栈是一种操作受限制的线性表。即:LIFO(Last In, First Out)。
Stack常见的方法
// 压栈
E push(E e);
// 出栈
E pop();
// 获取栈顶元素,不出栈
E peek();
// 判断栈是否为空
boolean empty();
自己实现一个Stack(ArrayList实现)
public class MyArrayStack<E> {
private List<E> stackList;
private static final int DEFAULT_CAPACITY = 10;
public MyStack(){
this(DEFAULT_CAPACITY);
}
public MyStack(int capacity){
stackList = new ArrayList<>(capacity);
}
// 压栈
public E push(E e){
stackList.add(e);
return e;
}
// 出栈
public E pop(){
ensureCapacity();
return stackList.remove(stackList.size() - 1);
}
// 获取栈顶元素,不出栈
public E peek(){
ensureCapacity();
return stackList.get(stackList.size() - 1);
}
// 判断栈是否为空
public boolean empty(){
return stackList.isEmpty();
}
private void ensureCapacity(){
if (empty()){
throw new IllegalArgumentException("Illegal Capacity: " + stackList.size());
}
}
}
自己实现一个Stack(LinkedList实现)
public class MyLinkedStack<E> {
private LinkedList<E> stackList = new LinkedList<>();
// 压栈
public E push(E e){
stackList.addLast(e);
return e;
}
// 出栈
public E pop(){
return stackList.removeLast();
}
// 获取栈顶元素,不出栈
public E peek(){
return stackList.getLast();
}
// 判断栈是否为空
public boolean empty(){
return stackList.isEmpty();
}
}
对于Stack的数据结构,因为它是在栈顶进行增删操作,所以使用数组或链表都可以,时间复杂度均为O(1),但是数组的性能最好。
废弃
在Java的java.util包下,提供了栈的实现:java.util.Stack。但是官方不建议使用此类来实现栈的相关操作。
Java官方建议使用双向队列Deque来实现栈的相关操作:
Deque<Integer> stack = new ArrayDeque<>();
Deque是双向队列,既有队列的性质,也有栈的性质。