栈的定义
- 栈是一种特殊的线性表,只能在一端进行操作。
- 往栈中添加元素的操作,一般叫做 push,入栈。
- 从栈中移除元素的操作,一般叫做 pop,出栈(只能移除栈顶元素,也叫做:弹出栈顶元素)。
- 后进先出的原则,Last In First Out,LIFO。
栈的结构
栈的底层其实就是线性表,可以用链表或者动态数组实现,且由其在线性表尾部频繁增加删除元素的特点,使用链表与动态数组的性能差不多。
出栈:
入栈:
链表的接口设计
方法声明 | 功能介绍 |
---|---|
int size() | 返回链表大小 |
boolean isEmpty() | 判断链表是否为空 |
void push(E element) | 将元素入栈 |
E pop() | 将元素出栈 |
E top() | 获取栈顶元素 |
void clear() | 清空 |
具体实现
由于栈的这些接口在动态数组或者链表中都直接或间接存在,完全可以让栈继承其中结构,再实现缺失的方法。即:
public class Stack extends ArrayList{
...
}
但如果仅仅如此,动态数组中的其他公有方法将也可以被栈对象调用,比如add(2,element):向索引2插入新元素、remove(0):删除第一个元素等,这些操作显然与与先进后出的原则相违背,因此在Stack类内部使用ArrayList对象并私有化是一个更合理的选择。
public class Stack<E> {
//避免继承带来其他接口可被使用的问题
private List<E> list=new ArrayList<>();
public int size(){
return list.size();
}
public boolean isEmpty(){
return list.isEmpty();
}
/**
* 进栈
* @param element
*/
public void push(E element){
list.add(element);
}
/**
* 出栈
* @return
*/
public E pop(){
return list.remove(list.size()-1);
}
/**
* 获取栈顶元素
* @return
*/
public E top(){
return list.get(list.size()-1);
}
/**
* 清空元素
*/
public void clear(){
list.clear();
}
}
其中动态数组的构造见:动态数组ArrayList的实现(添加缩容功能)