目录
栈的定义
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
在现实中的例子:
栈的使用
如上就是栈中主要的方法
下图就是压栈和出栈的一个示例,演示栈先进后出的规则。
栈的模拟实现(数组实现)
public class MyStack {
// 定义一个数组
private int[] elementData;
// 记录栈大小
private int size;
// 常量为数组初始大小
private final int DEFAULT_CAPACITY = 5;
// 构造方法初始化数组
public MyStack(int capacity) {
if (capacity < 0) {
throw new RuntimeException("数组容量不能小于0");
} else if (capacity > 0) {
this.elementData = new int[capacity];
}else {
this.elementData = new int[DEFAULT_CAPACITY];
}
}
// 压栈
public void push(int data){
// 是否需要扩容
ensureCapacity();
elementData[size] = data;
size++;
}
//扩容操作
private void ensureCapacity() {
if (size == elementData.length) {
this.elementData = Arrays.copyOf(elementData, elementData.length * 2);
}
}
// 出栈
public int pop(){
//直接引用peek()并且记录
int top = peek();
size--;
return top;
}
// 查看栈顶元素
public int peek(){
//判断
if (size < 0){
throw new RuntimeException("栈为空");
}
int top = elementData[size - 1];
return top;
}
}
概念区分
栈: 一般认为是后进先出的一种数据结构——在java的集合中有对应的实现---Stack,
Stack在实现时继承了Vector。
虚拟机栈:具有特殊作用的一块内存空间(这里不过多介绍,jvm部分详细介绍)。
栈帧:一种结构,这种结构与函数调用相关的,内部:局部变量表、操作数栈...... 每个方法在运行时,jvm都会创建一个栈帧,然后将栈帧压入到虚拟机栈中。 方法调用结束时,该方法对应的栈帧会从虚拟机栈中出栈。