首先,我们回顾一下栈的定义:
栈本质上就是一种特殊的线性表
栈是限定仅在表尾进行插入和删除操作的线性表,先进后出的结构
元素插入叫进栈,元素删除叫出栈
栈的两个基本操作图解:
在实现之前,我们需要定义一个线性表。由于这不是我们今天的重点,我就直接把代码的链接放在下面了:
[https://blog.csdn.net/qq_43138320/article/details/88919467]
接下来,我们定义一个栈的接口:
public interface Stack <E>{
public void push(E e); //进栈
public E pop();//出栈
public E peek(); //获取栈顶元素
public boolean isEmpty(); //判断栈是否为空
public int getSize(); //获取栈元素个数
public void clear(); //清空栈
}
有了线性表与栈的接口,栈的实现就变得很简单了,最后让我们来看具体实现:
public class ArrayStack <E> implements Stack <E>{
private ArrayList<E> list;
public ArrayStack() { //空构造
this(10);
}
public ArrayStack(int capacity) { //有参构造
list = new ArrayList<>(capacity);
}
@Override
public void push(E e) { //进栈
list.addLast(e);
}
@Override
public E pop() { //出栈
return list.removeLast();
}
@Override
public E peek() {
return list.getLast();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public int getSize() {
return list.getSize();
}
@Override
public void clear() {
list.clear();
}
public int getCapacity() { //获取当前栈的最大容量
return list.getCapacity();
}
@Override
public String toString() { //重写toString
StringBuilder sb=new StringBuilder();
if(isEmpty()){
sb.append(String.format("ArrayStack:bottom[]top %d/%d", getSize(),getCapacity()));
}else{
sb.append("ArrayStack:bottom[");
for(int i=0;i<list.getSize();i++){
if(i==list.getSize()-1){
sb.append( list.get(i)+"]top");
}else{
sb.append(list.get(i)+",");
}
}
sb.append(String.format(" %d/%d \n", getSize(),getCapacity()));
}
return sb.toString();
}
}
今天就先到这里,接下来就没这么轻松了哦。