目录
1. 概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据在栈顶。
2.栈的使用
方法 | 功能 |
Stack() | 构入栈造一个空的栈 |
E push( E e) | 将e入栈,并返回e |
E pop() | 将栈顶元素出栈并返回 |
E peek() | 获取栈顶元素 |
int size() | 获取栈中有效元素个数 |
boolean empty() | 检测栈是否为空 |
3.栈的模拟实现
从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。
import java.util.Arrays;
import java.util.NoSuchElementException;
public class MyStack <E>{
//保存元素的数组
private Object data[];
//实际元素的个数
private int size;
//初始化数组
public MyStack() {
this.data = new Object[10];
}
public MyStack(int size) {
this.data = new Object[size];
}
//入栈
public void push(E element){
data[size++] = element;
//栈满需要扩充
if(size == data.length){
isFull();
}
}
private void isFull(){
this.data = Arrays.copyOf(data,data.length<<1);
}
//出栈
public E pop(){
if(empty()){
throw new NoSuchElementException("没有元素~");
}
E val = (E)data[size-1];
size--;
return val;
}
//获取栈顶元素
public E peek(){
if(empty()){
throw new NoSuchElementException("没有元素~");
}
return (E)data[size-1];
}
//获取栈中有效元素个数
public int size(){
return size;
}
//检测栈是否为空
public boolean empty(){
return size == 0;
}
}
4.思考题
栈、虚拟机栈、栈帧有什么区别呢?