栈是限定仅在表尾进行插入和删除操作的线性表,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称为后进先出 或者 先进后出的线性表,简称LIFO( Last In First Out ) 或者 FILO( First In Last Out )结构,栈本身是一个线性表,其数据元素具有线性关系,只不过它是一种特殊的线性表而已,栈的插入操作,叫作进栈,也称压栈、入栈 栈的删除操作,叫作出栈,也称弹栈
因此我们实现栈时底层其实是对线性表的进一步封装。
对栈进行操作的接口:
public interface Stack<E> extends Iterable<E> {
//获取栈中的有效元素个数
public int size();
//判断栈是否为空
public boolean isEmpty();
//入栈 进栈一个元素 在线性表的表尾添加一个元素
public void push(E element);
//出栈 弹出一个元素 在线性表的表尾删除一个元素
public E pop();
//查看当前栈顶元素 并不是移除 查看线性表中最后一个元素
public E peek();
//清空栈中全部元素
public void clear();
}
我们通过实现该接口来创建栈:
public class ArrayStack<E> implements Stack<E> {
ArrayList<E> list; //定义存放数据的容器 底层还是ArrayList
public ArrayStack(){ //定义ArrayStack的无参构造
list = new ArrayList<>();
}
public ArrayStack(int capacity){ //定义ArrayStack的带起始容量的带参构造
list = new ArrayList<>(capacity);
}
//获取栈中的有效元素个数
@Override
public int size() {
return list.size();
}
//判断栈是否为空
@Override
public boolean isEmpty() {
return list.isEmpty();
}
//入栈 进栈一个元素 在线性表的表尾添加一个元素
@Override
public void push(E element) {
list.add(element);
}
//出栈 弹出一个元素 在线性表的表尾删除一个元素
@Override
public E pop() {
return list.remove(list.size() - 1);
}
//查看当前栈顶元素 并不是移除 查看线性表中最后一个元素
@Override
public E peek() {
return list.get(list.size() - 1);
}
//清空栈中全部元素
@Override
public void clear() {
list.clear();
}
//栈的迭代方法
@Override
public Iterator iterator() {
return list.iterator();
}
//判断两个栈是否相等
public boolean equals(Object o){
if(o == null){
return false;
}
if(this == o){
return true;
}
if(o instanceof ArrayStack){
ArrayStack other = (ArrayStack) o;
return this.list.equals(other.list);
}
return false;
}
//规定栈输出是的格式
public String toString(){
StringBuilder str = new StringBuilder();
str.append("ArrayStack: " + size() + "/" + list.capacity() + " [");
if(isEmpty()){
str.append(']');
}
for (int i = 0; i < size(); i++){
str.append(list.get(i));
if(i == size() - 1){
str.append(']');
}else{
str.append(',');
str.append(' ');
}
}
return str.toString();
}
}